go语言中的反射

反射介绍

通过对象获取当前对象对应类文件的各个属性和对应值

json反序列化是反射的常见应用

type person struct {
  Name string `json:"name"`
  Age int `json:"age"`
}


func main(){
  str := `{"name":"zhoulin", "age":9000}`
  var p person
  json.Unmarshal([]byte(str), &p)
  fmt.Println(p.Name, p.Age)
}

反射机制-reflect包

  • 核心函数reflect.TypeOf
  • 注意:经常搭配使用的函数有IsValid(), IsNil()
  • 反射是把双刃剑
    • 1.反射代码难懂
    • 2.反射容易导致panic
    • 3.反射性能低下

类型查看/反射的常见用法DEMO

import (
"fmt"
"reflect"
)

func reflecType(x interface{}){
v := reflect.TypeOf(x)
fmt.Println("type:%v\n", v)
fmt.Println("type name:%v , rtpe kind:%v \n", v.getName(), v.getType())
}

type Cat struct{}

//通过反射设置变量的值
func reflectSetValue1(x interface{}){
v := reflect.ValueOf(x)
if v.Kind() == reflect.Int64{
v.SetInt(200) //修改的是副本, reflect 包会引发panic
}
}

//通过反射设置变量的值
func reflectSetValue2(x interface{}){
v := reflect.ValueOf(x)
//反射中使用Elem()获取指针对应的值
if v.Elem().Kind() == reflect.Int64{
v.Elem().SetInt(200)
}
}

func main(){
var a float32 = 3.14
reflectType(a) //type name:float32 type kind:float32
var b int64 = 100
reflectType(b) // type name :int64 type kind :int64
var c = Cat{}
reflectType(c) // type name :Cat type kind :struct
reflectSetValue1(&b)
fmt.Println(b) //依然为100
reflectSetValue2(&b)

}

你可能感兴趣的:(go语言中的反射)