指针

“指向X的指针”和“X”是两种不同的类型。
如果reflect.Value引用了指向值的指针,你可以通过调用Elem()来获取该引用对应的值。
package main
import (
"fmt"
"reflect"
)
func printIntResolvingPointers(v interface{}) {
rv := reflect.ValueOf(v)
typeName := rv.Type().String()
name := ""
for rv.Kind() == reflect.Ptr {
name = "pointer to " + name
rv = rv.Elem()
}
name += rv.Type().String()
fmt.Printf("Value: %d. Type: '%s' i.e. '%s'.\n\n", rv.Int(), name, typeName)
}
func main() {
n := 3
printIntResolvingPointers(n)
n = 4
printIntResolvingPointers(&n)
n = 5
np := &n
printIntResolvingPointers(&np)
}
/*
----------OUTPUT-----------
Value: 3. Type: 'int' i.e. 'int'.
Value: 4. Type: 'pointer to int' i.e. '*int'.
Value: 5. Type: 'pointer to pointer to int' i.e. '**int'.
*/
接口实际上也是指向其底层值的指针,因此Elem()也适用于接口值反射后的reflect.Value变量。