在 Go 中,我如何检查一个值是(任何)指针类型?
In Go, how do I check a value is of (any) pointer type?
我有一个 interface{}
的切片,我需要检查这个切片是否包含指针字段值。
澄清示例:
var str *string
s := "foo"
str = &s
var parms = []interface{}{"a",1233,"b",str}
index := getPointerIndex(parms)
fmt.Println(index) // should print 3
您可以使用反射(reflect
包)来测试一个值是否为指针类型。
func firstPointerIdx(s []interface{}) int {
for i, v := range s {
if reflect.ValueOf(v).Kind() == reflect.Ptr {
return i
}
}
return -1
}
请注意,上面的代码测试了 interface{}
中 "wrapped" 值的类型(这是 s
切片参数的元素类型)。这意味着如果你像这样传递一个切片:
s := []interface{}{"2", nil, (*string)(nil)}
它将 return 2
因为即使第 3 个元素是 nil
指针,它仍然是一个指针(包装在非 nil
接口值中) .
我有一个 interface{}
的切片,我需要检查这个切片是否包含指针字段值。
澄清示例:
var str *string
s := "foo"
str = &s
var parms = []interface{}{"a",1233,"b",str}
index := getPointerIndex(parms)
fmt.Println(index) // should print 3
您可以使用反射(reflect
包)来测试一个值是否为指针类型。
func firstPointerIdx(s []interface{}) int {
for i, v := range s {
if reflect.ValueOf(v).Kind() == reflect.Ptr {
return i
}
}
return -1
}
请注意,上面的代码测试了 interface{}
中 "wrapped" 值的类型(这是 s
切片参数的元素类型)。这意味着如果你像这样传递一个切片:
s := []interface{}{"2", nil, (*string)(nil)}
它将 return 2
因为即使第 3 个元素是 nil
指针,它仍然是一个指针(包装在非 nil
接口值中) .