Go语言-反射

110 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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有三类方法

  1. 获取和修改对应值
  2. 和struct类型字段有关用于获取对应字段
  3. 和类型上方法集有关用于获取对应方法

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)
}

反射定律

反射是计算机语言中程序检视其自身结构的一种方法,属于元编程的一种形式

  1. 任何接口值interface{}都可反射出反射对象
  2. 反射对象也可还原为interface{}变量
  3. 要修改反射的对象,该值必须可设置,可寻址