如何检查接口是否是指向切片的指针

我知道如何检查接口是否是指针:


func isPointerArray(i interface{}) bool {

    if i == nil {

        return false

    }

    if reflect.ValueOf(i).Kind() != reflect.Ptr {

        return false

    }

}

但是如何检查该指针是否为切片?TypeOf是一个指针。


富国沪深
浏览 74回答 2
2回答

守候你守候我

如果 value 的 kind 是reflect.Ptr,你可以Value.Elem()用来获取指向的值,你可以将它的 kind 与 进行比较reflect.Slice。这就是它的样子:func isPtrSlice(i interface{}) bool {&nbsp; &nbsp; if i == nil {&nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; }&nbsp; &nbsp; v := reflect.ValueOf(i)&nbsp; &nbsp; if v.Kind() != reflect.Ptr {&nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; }&nbsp; &nbsp; return v.Elem().Kind() == reflect.Slice}但是有一个问题。如果传递的值是指向切片类型的指针,但值本身是nil指针,则会报告false. 可以理解,因为没有类型可以是切片的指向值。这可能是也可能不是您想要的。如果您true甚至想要nil指针值(指向切片类型的指针),您可以使用reflect.Type而不是reflect.Value. 这也适用于nil指针,因为即使没有指向的值,仍然有一个指向的类型(称为基本类型)。func isPtrSlice2(i interface{}) bool {&nbsp; &nbsp; if i == nil {&nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; }&nbsp; &nbsp; t := reflect.TypeOf(i)&nbsp; &nbsp; if t.Kind() != reflect.Ptr {&nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; }&nbsp; &nbsp; return t.Elem().Kind() == reflect.Slice}测试上述功能:vals := []interface{}{&nbsp; &nbsp; nil,&nbsp; &nbsp; "a",&nbsp; &nbsp; &image.Point{},&nbsp; &nbsp; []string{},&nbsp; &nbsp; &[]string{},&nbsp; &nbsp; (*[]string)(nil),}for _, v := range vals {&nbsp; &nbsp; fmt.Printf("%-14T isPtrSlice: %-5t, isPtrSlice2: %t\n",&nbsp; &nbsp; &nbsp; &nbsp; v, isPtrSlice(v), isPtrSlice2(v))}哪个会输出(在Go Playground上试试):<nil>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; isPtrSlice: false, isPtrSlice2: falsestring&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;isPtrSlice: false, isPtrSlice2: false*image.Point&nbsp; &nbsp;isPtrSlice: false, isPtrSlice2: false[]string&nbsp; &nbsp; &nbsp; &nbsp;isPtrSlice: false, isPtrSlice2: false*[]string&nbsp; &nbsp; &nbsp; isPtrSlice: true , isPtrSlice2: true*[]string&nbsp; &nbsp; &nbsp; isPtrSlice: false, isPtrSlice2: true正如您在最后一行(其中值是niltype 的指针*[]string)中看到的那样,在isPtrSlice()返回false时isPtrSlice2()返回true。

慕虎7371278

您可以使用类型断言:package mainimport "fmt"func main() {&nbsp; &nbsp; var value interface{}&nbsp; &nbsp; value = &[]int{1, 2}&nbsp; &nbsp; if res, ok := value.(*[]int); ok {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(res)&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go