在Go中,如何检查(任何)指针类型的值?

Ela*_*lad 8 reflection pointers go go-interface

我有一片,interface{}我需要检查这个片是否包含指针字段值.

澄清示例:

var str *string
s := "foo"
str = &s
var parms = []interface{}{"a",1233,"b",str}
index := getPointerIndex(parms)
fmt.Println(index) // should print 3
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 11

您可以使用反射(reflect包)来测试值是否为指针类型.

func firstPointerIdx(s []interface{}) int {
    for i, v := range s {
        if reflect.ValueOf(v).Kind() == reflect.Ptr {
            return i
        }
    }
    return -1
}
Run Code Online (Sandbox Code Playgroud)

请注意,上面的代码测试了一个"包装"的值的类型interface{}(这是sslice参数的元素类型).这意味着如果您传递这样的切片:

s := []interface{}{"2", nil, (*string)(nil)}
Run Code Online (Sandbox Code Playgroud)

它将返回,2因为即使第3个元素是nil指针,它仍然是一个指针(包装在非nil接口值中).