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