跳到主要内容

反射

具体类型解析

下述demo中默认

rt = reflect.TypeOf(data)
rv = reflect.ValueOf(data)

Struct

//遍历结构体的Field
for i := 0; i < rt.NumField(); i++ {
rt.Field(i) //第i个Field的StructField
rv.Filed(i) //第i个Field的Value
}

//遍历结构体的方法
for i := 0; i < rt.NumMethod(); i++ {
rt.Method(i) //第i个方法的Method
rv.Method(i) //第i个方法的Value
}

Map

//遍历Map的key和value
for _, key := range rv.MapKeys() {
//其中key为键的Value
rv.MapIndex(key) //键值的Value
}

rv.Len() //map的大小
rv.SetMapIndex() //map索引赋值

Slice Array

//遍历Slice或者Array
for i := 0; i < rv.Len(); i++ {
rv.Index(i) //子元素的Value
}

rv.Cap() //获取切片或者Array容量
rv.SetCap(i) //调整切片容量
rv.Slice(i, j) //返回切片s[i:j]的Value

Ptr Interface

if !rv.IsNil() {
rv.Elem() //指针或者interface实际指向元素
}

Bool Int Unit Float Complex String

rv.Bool() //返回bool
rv.Int() //返回int64
rv.Uint() //返回uint64
rv.Float() //返回float64
rv.Complex() //返回complex128
rv.Sting() //返回string

//修改Value结构中的值,必须类型一致
rv.Set()
rv.SetBool()
rv.SetInt()
rv.SetUint()
rv.SetFloat()
rv.SetComplex()
rv.SetString()
rv.SetBytes()

Func Chan UnsafePointer

动态解析的时候,用得比较少,这里就不说了

Type和Value方法

Type和Value拥有的同名方法

MethodType返回类型Value返回类型备注KindKindKind返回指定对象的Kind类型NumMethodintint返回struct拥有的方法总数,包括unexported方法MethodByNameMethodValue根据方法名找方法MethodMethodValue返回第i个方法NumFieldintint返回struct所包含的field数量FieldStructFieldValue取struct结构的第n个fieldFieldByIndexStructFieldValue嵌套的方式取struct的field,比如v.FieldByIndex([]int2)等价于 v.field(1).field(2)FieldByNameStructFiel,boolValue返回名称匹配match函数的fieldFieldByNameFuncStructField,boolValue返回名称匹配match函数的field

Type独有的方法

Method备注Align分配内存时的内存对齐字节数FieldAlign作为struct的field时内存对齐字节数Nametype名 string类型PkgPath包路径, "encoding/base64", 内置类型返回empty stringSize该类型变量占用字节数Stringtype的string表示方式Implements判断该类型是否实现了某个接口AssignableTo判断该类型能否赋值给某个类型ConvertibleTo判断该类型能否转换为另外一种类型Comparable判断该类型变量是否可以比较ChanDir返回channel的方向 recv/send/doubleIsVariadic判断函数是否接受可变参数Elem取该类型的元素In函数第n个入参Out函数第n个出参NumIn函数的入参数个数NumOut函数的出参个数Key返回map结构的key类型TypeLen返回array的长度

Value独有的方法

Method备注Addrv的指针,前提时CanAddr()返回trueBool取值,布尔类型Bytes取值,字节流Call调用函数CallSlice调用具有可变参的函数CanAddr判断能否取址CanInterface判断Interface方法能否使用CanSet判断v的值能否改变Cap判断容量 Array/Chan/SliceClose关闭ChanComplex取值,复数Convert返回将v转换位type t的结果Elem返回interface包含或者Ptr指针的实际值Float取值,浮点型Index 索引操作Array/Slice/StringInt取值,整型Interface将当前value以interface形式返回IsNil判断是否为nil,chan, func, interface, map, pointer, or slice valueIsValid是否是可操作的Value,返回false表示为zero ValueLen适用于Array, Chan, Map, Slice, or StringMapIndex对map类型按key取值MapKeysmap类型的所有key的列表OverflowComplex溢出判断OverflowFloat溢出判断OverflowInt溢出判断OverflowUint溢出判断Pointer返回uintptr 适用于sliceRecvchan接收Sendchan发送Set将x赋值给v,类型要匹配SetBoolBool赋值,需要先判断CanSet()为trueSetBytesBytes赋值SetCapslice调整切片容量SetMapIndexmap索引赋值SetUintUnit赋值SetPointerunsafe.Pointer赋值SetStringString赋值Slicereturn v[i:j] 适用于Array/Slict/StringStringreturn value的string表示方法TryRecvchan非阻塞接收TrySendchan非阻塞发送Type返回value的TypeUnsafeAddr返回指向value的data的指针