反射 Reflect #
reflect.ValueOf 函数直接返回的 reflect.Value 值都是不可修改的(reflect.Elem 可以)。
有两种方法获取一个代表着一个指针所引用着的值的 reflect.Value 值:
- 通过调用代表着此指针值的
reflect.Value值的Elem方法。 - 将代表着此指针值的
reflect.Value值的传递给一个reflect.Indirect函数调用。 (如果传递给一个reflect.Indirect函数调用的实参不代表着一个指针值,则此调用返回此实参的一个复制。)
Reflect package #
func ValueOf(i interface{}) Value
返回一个新的 reflect.Value 对象,内容为 i 中的确定值。ValueOf(nil) 返回 reflect.Value 的零值
func (v Value) Addr() Value
Addr returns a pointer value representing the address of v. It panics if CanAddr() returns false. Addr is typically used to obtain a pointer to a struct field or slice element in order to call a method that requires a pointer receiver.
可以理解成 &p 操作。
func (v Value) Interface() (i interface{})
Interface returns v’s current value as an interface{}.
使用空接口类型来返回 v 当前的值。
func (v Value) Elem() Value
Elem returns the value that the interface v contains or that the pointer v points to. It panics if v’s Kind is not Interface or Ptr. It returns the zero Value if v is nil.
若 v 是值,则返回值。若 v 是指向值的指针,则返回指针指向的值(就如同 *p)。
func (v Value) Kind() Kind
返回 v 中值的类型。
Kind 表示的是一些特定的 Type(可以认为是 Type 的一个子集)。
func (v Value) Pointer() uintptr
将 v 的值以 uintptr 类型返回。如果 v 的类型(Kind)不为 Chan, Func, Map, Ptr, Slice, or UnsafePointer,则会抛出 panic。
func (v Value) Set(x Value)
将 x 赋给 v 的值。若 CanSet 为 false ,则抛出 panic。
func (v Value) Type() Type
返回 v 中的 type 结构数据。