//读 func (v Value) Float() float64 { k := v.kind() switch k { case Float32: returnfloat64(*(*float32)(v.ptr)) case Float64: return *(*float64)(v.ptr) } panic(&ValueError{"reflect.Value.Float", v.kind()}) } func (v Value) Bool() bool func (v Value) Bytes() []byte func (v Value) Int() int64 func (v Value) Uint() uint64 func (v Value) String() string func (v Value) Complex() complex128 //写 func (v Value) Set(x Value) func (v Value) SetBool(x bool) func (v Value) SetBytes(x []byte) func (v Value) SetCap(n int) func (v Value) SetComplex(x complex128) func (v Value) SetFloat(x float64) func (v Value) SetInt(x int64) { v.mustBeAssignable() switch k := v.kind(); k { default: panic(&ValueError{"reflect.Value.SetInt", v.kind()}) case Int: *(*int)(v.ptr) = int(x) case Int8: *(*int8)(v.ptr) = int8(x) case Int16: *(*int16)(v.ptr) = int16(x) case Int32: *(*int32)(v.ptr) = int32(x) case Int64: *(*int64)(v.ptr) = x } } func (v Value) SetLen(n int) func (v Value) SetMapIndex(key, val Value) func (v Value) SetPointer(x unsafe.Pointer) func (v Value) SetString(x string) func (v Value) SetUint(x uint64)
func (v Value) Elem() Value //返回指针或者interface包含的值 func (v Value) Field(i int) Value //返回struct的第i个field func (v Value) FieldByIndex(index []int) Value //返回嵌套struct的成员 func (v Value) FieldByName(name string) Value //通过成员名称返回对应的成员 func (v Value) FieldByNameFunc(match func(string) bool) Value //只返回满足函数match的第一个field
通过上面的方法不出意外就可以取得对应是struct field了。
其他类型:Array, Slice, String
对于其他类型,reflect也提供了获得其内部成员的方法。
1 2 3 4 5 6
func (v Value) Len() int//Array, Chan, Map, Slice, or String func (v Value) Index(i int) Value //Array, Slice, String func (v Value) Cap() int//Array, Chan, Slice func (v Value) Close() //Chan func (v Value) MapIndex(key Value) Value //Map func (v Value) MapKeys() []Value //Map
函数调用
reflect当然也可以实现函数调用,下面是一个简单的例子。
1 2 3 4 5 6 7 8 9 10
func main() { var f = func() { fmt.Println("hello world") } fun := reflect.ValueOf(f) fun.Call(nil) } //Output hello world
func (v Value) Call(in []Value) []Value func (v Value) CallSlice(in []Value) []Value func (v Value) Method(i int) Value //v's ith function func (v Value) NumMethod() int func (v Value) MethodByName(name string) Value
//读 func (v Value) Float() float64 { k := v.kind() switch k { case Float32: returnfloat64(*(*float32)(v.ptr)) case Float64: return *(*float64)(v.ptr) } panic(&ValueError{"reflect.Value.Float", v.kind()}) } func (v Value) Bool() bool func (v Value) Bytes() []byte func (v Value) Int() int64 func (v Value) Uint() uint64 func (v Value) String() string func (v Value) Complex() complex128 //写 func (v Value) Set(x Value) func (v Value) SetBool(x bool) func (v Value) SetBytes(x []byte) func (v Value) SetCap(n int) func (v Value) SetComplex(x complex128) func (v Value) SetFloat(x float64) func (v Value) SetInt(x int64) { v.mustBeAssignable() switch k := v.kind(); k { default: panic(&ValueError{"reflect.Value.SetInt", v.kind()}) case Int: *(*int)(v.ptr) = int(x) case Int8: *(*int8)(v.ptr) = int8(x) case Int16: *(*int16)(v.ptr) = int16(x) case Int32: *(*int32)(v.ptr) = int32(x) case Int64: *(*int64)(v.ptr) = x } } func (v Value) SetLen(n int) func (v Value) SetMapIndex(key, val Value) func (v Value) SetPointer(x unsafe.Pointer) func (v Value) SetString(x string) func (v Value) SetUint(x uint64)
func (v Value) Elem() Value //返回指针或者interface包含的值 func (v Value) Field(i int) Value //返回struct的第i个field func (v Value) FieldByIndex(index []int) Value //返回嵌套struct的成员 func (v Value) FieldByName(name string) Value //通过成员名称返回对应的成员 func (v Value) FieldByNameFunc(match func(string) bool) Value //只返回满足函数match的第一个field
通过上面的方法不出意外就可以取得对应是struct field了。
其他类型:Array, Slice, String
对于其他类型,reflect也提供了获得其内部成员的方法。
1 2 3 4 5 6
func (v Value) Len() int//Array, Chan, Map, Slice, or String func (v Value) Index(i int) Value //Array, Slice, String func (v Value) Cap() int//Array, Chan, Slice func (v Value) Close() //Chan func (v Value) MapIndex(key Value) Value //Map func (v Value) MapKeys() []Value //Map
函数调用
reflect当然也可以实现函数调用,下面是一个简单的例子。
1 2 3 4 5 6 7 8 9 10
func main() { var f = func() { fmt.Println("hello world") } fun := reflect.ValueOf(f) fun.Call(nil) } //Output hello world
func (v Value) Call(in []Value) []Value func (v Value) CallSlice(in []Value) []Value func (v Value) Method(i int) Value //v's ith function func (v Value) NumMethod() int func (v Value) MethodByName(name string) Value