指针

“指向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变量。

最后更新于