一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情。
前言
在开发中会有很多字符串和结构体的转换,比如将api返回的json字符串转换为结构体。将json字符串转换为结构体用到的就是反射知识。
反射
什么是反射
运行时反射提供了一种可以在运行时操作任意类型对象的能力。
Go语言是静态编译类语言,但是有一些东西只有运行时才能知道,比如interface类型的参数。同时,想要知道结构体有哪些字段和方法,也需要反射。
reflect.Value和reflect.Type
Go语言反射定义中,任何接口都由两部分组成:接口的具体类型,以及具体类型对应的值
注意: interface是空接口,可表示任何类型,可把任何类型转换为空接口,常用于反射、类型断言以减少重复代码,简化编程。
func main() {
i := 3
iv := reflect.ValueOf(i)
it := reflect.TypeOf(i)
fmt.Println(iv, it)
}
reflect.ValueOf返回reflect.Value,reflect.TypeOf返回reflect.Type。
reflect.Value
type Value struct {
type *rtype
ptr unsafe.Pointer
flag
}
reflect.Value有三类方法
- 获取和修改对应值
- 和struct类型字段有关用于获取对应字段
- 和类型上方法集有关用于获取对应方法
reflect.Type
如果和变量类型本身有关的操作,则最好使用reflect.Type。要反射获取一个变量的reflect.Type,可通过函数reflect.TypeOf
JSON 和Struct互转
func main() {
p: =person{Name: "yzy",Age: 20}
//struct to json
jsonB,err:
=json.Marshal(p)
if err==nil {
fmt.Println(string(jsonB))
}
//json to struct
respJSON: ="{"Name":"李四","Age":40}"
json.Unmarshal([]byte(respJSON),&p)
fmt.Println(p)
}
反射定律
反射是计算机语言中程序检视其自身结构的一种方法,属于元编程的一种形式
- 任何接口值interface{}都可反射出反射对象
- 反射对象也可还原为interface{}变量
- 要修改反射的对象,该值必须可设置,可寻址