如何判断interface类型变量是否是指向切片的指针
实现逻辑
你可以通过reflect.Value的Elem()方法获取指针指向的底层值,再判断其类型是否为切片即可,完整校验函数如下:
func isPointerToSlice(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 }
测试验证
你可以用以下用例验证效果:
func main() { var a int = 10 var s []string = []string{"a", "b"} var p1 *int = &a var p2 *[]string = &s var p3 *[]int = nil // 空指针,指向切片类型 fmt.Println(isPointerToSlice(nil)) // false fmt.Println(isPointerToSlice(a)) // false fmt.Println(isPointerToSlice(s)) // false fmt.Println(isPointerToSlice(p1)) // false fmt.Println(isPointerToSlice(p2)) // true fmt.Println(isPointerToSlice(p3)) // true (即使指针为空,类型匹配依然返回true) }
注意要点
- 即使指针本身是nil,只要指针的类型是「指向切片的指针」,该函数也会返回true,符合Go的类型校验逻辑
- 如果需要额外校验指针指向的切片非空,可以在最后一步追加
!v.Elem().IsNil()的判断即可
内容的提问来源于stack exchange,提问作者Ado Ren
相关产品推荐
相关产品推荐

