reflect

最后更新于:2022-04-02 02:45:39

[TOC] ## reflect ### type 所有的类型 ``` const ( Invalid Kind = iota Bool Int Int8 Int16 Int32 Int64 Uint Uint8 Uint16 Uint32 Uint64 Uintptr Float32 Float64 Complex64 Complex128 Array Chan Func Interface Map Ptr Slice String Struct UnsafePointer ) ``` ### reflect.ValueOf ``` type Value func ValueOf(i interface{}) Value func Zero(typ Type) Value func New(typ Type) Value func NewAt(typ Type, p unsafe.Pointer) Value func Indirect(v Value) Value func MakeSlice(typ Type, len, cap int) Value func MakeMap(typ Type) Value func MakeChan(typ Type, buffer int) Value func MakeFunc(typ Type, fn func(args []Value) (results []Value)) Value func Append(s Value, x ...Value) Value func AppendSlice(s, t Value) Value func (v Value) IsValid() bool func (v Value) IsNil() bool func (v Value) Kind() Kind func (v Value) Type() Type func (v Value) Convert(t Type) Value func (v Value) Elem() Value func (v Value) Bool() bool func (v Value) Int() int64 func (v Value) OverflowInt(x int64) bool func (v Value) Uint() uint64 func (v Value) OverflowUint(x uint64) bool func (v Value) Float() float64 func (v Value) OverflowFloat(x float64) bool func (v Value) Complex() complex128 func (v Value) OverflowComplex(x complex128) bool func (v Value) Bytes() []byte func (v Value) String() string func (v Value) Pointer() uintptr func (v Value) InterfaceData() [2]uintptr func (v Value) Slice(i, j int) Value func (v Value) Slice3(i, j, k int) Value func (v Value) Cap() int func (v Value) Len() int func (v Value) Index(i int) Value func (v Value) MapIndex(key Value) Value func (v Value) MapKeys() []Value func (v Value) NumField() int func (v Value) Field(i int) Value func (v Value) FieldByIndex(index []int) Value func (v Value) FieldByName(name string) Value func (v Value) FieldByNameFunc(match func(string) bool) Value func (v Value) Recv() (x Value, ok bool) func (v Value) TryRecv() (x Value, ok bool) func (v Value) Send(x Value) func (v Value) TrySend(x Value) bool func (v Value) Close() func (v Value) Call(in []Value) []Value func (v Value) CallSlice(in []Value) []Value func (v Value) NumMethod() int func (v Value) Method(i int) Value func (v Value) MethodByName(name string) Value func (v Value) CanAddr() bool func (v Value) Addr() Value func (v Value) UnsafeAddr() uintptr func (v Value) CanInterface() bool func (v Value) Interface() (i interface{}) func (v Value) CanSet() bool func (v Value) SetBool(x bool) func (v Value) SetInt(x int64) func (v Value) SetUint(x uint64) func (v Value) SetFloat(x float64) func (v Value) SetComplex(x complex128) func (v Value) SetBytes(x []byte) func (v Value) SetString(x string) func (v Value) SetPointer(x unsafe.Pointer) func (v Value) SetCap(n int) func (v Value) SetLen(n int) func (v Value) SetMapIndex(key, val Value) func (v Value) Set(x Value) ``` ### Type ``` type Type func ArrayOf(count int, elem Type) Type func ChanOf(dir ChanDir, t Type) Type func FuncOf(in, out []Type, variadic bool) Type func MapOf(key, elem Type) Type func PtrTo(t Type) Type func SliceOf(t Type) Type func StructOf(fields []StructField) Type func TypeOf(i interface{}) Type ``` ## 实例 ### reflect.ValueOf 查看反射类型 ``` for _, v := range []interface{}{"hi", 42, func() {}} { switch v := reflect.ValueOf(v); v.Kind() { case reflect.String: fmt.Println(v.String()) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: fmt.Println(v.Int()) default: fmt.Printf("unhandled kind %s", v.Kind()) } } // Output: // hi // 42 // unhandled kind func ``` ### reflect.TypeOf 查看tag 标签 ``` type S struct { F string `species:"gopher" color:"blue"` } var s S of := reflect.TypeOf(s) fmt.Printf("%+v\n", of.Field(0).Tag.Get("species")) // gopher fmt.Printf("%+v\n", of.Field(0).Tag.Get("color")) // blue ``` ### Elem 当传入指针时,获取类型 ``` func main() { type Admin struct { username string `demo:"user" type:"name"` title string } a:=Admin{ username: "123", title: "22", } demo1(a) demo2(&a) } func demo1(i interface{}) { of := reflect.ValueOf(i) fmt.Printf("%+v\n", of.Field(0).String()) } func demo2(i interface{}) { of := reflect.ValueOf(i).Elem() fmt.Printf("%+v\n", of.Field(0).String()) } ``` ### Set 赋值 ``` type T struct { Age int Name string Children []int } // 初始化测试用例 t := T{12, "someone-life", nil} //var t T s := reflect.ValueOf(&t).Elem() // 反射获取测试对象对应的struct枚举类型fmt.Println(s.NumField()) //3 log.Printf("%v",s.NumField()) //3 s.Field(1).SetString("ccc") s.FieldByName("Age").SetInt(123) sliceValue := reflect.ValueOf([]int{1, 2, 3}) s.FieldByName("Children").Set(sliceValue) // 使用字段名称get,并赋值。赋值类型必须为reflect.Value fmt.Printf("%+v\n", s) //{Age:123 Name:ccc Children:[1 2 3]} ``` ### MakeFunc 泛型函数 ``` var intSwap func(int, int) (int, int) var floatSwap func(float64, float64) (float64, float64) var swap = func(in []reflect.Value) []reflect.Value { return []reflect.Value{in[1], in[0]} } func makeSwap(fptr interface{}) { fn := reflect.ValueOf(fptr).Elem() v := reflect.MakeFunc(fn.Type(), swap) fn.Set(v) } func init() { makeSwap(&intSwap) makeSwap(&floatSwap) } func main() { fmt.Println(intSwap(0, 1)) // 1 0 fmt.Println(floatSwap(2.72, 3.14)) // 3.14 2.72 } ``` ### reflect.DeepEqua` 可比较连个 interface 是否相等 ``` equal := reflect.DeepEqual([]string{"13"}, []string{"123"}) ```
';