golang之反射常用函数介绍

更新时间:2023-07-25 11:46:45 阅读: 评论:0

golang之反射常⽤函数介绍
⽬录
反射可以在运⾏时动态获取变量的各种信息,⽐如变量的类型、类别。如果是结构体变量,还可以获取到结构体本⾝的信息(包括结构体字段、⽅法)。通过反射,可以修改变量的值,可以调⽤关联的⽅法
1、通过反射获取到传⼊变量的type,值、kind
Type是类型,Kind是类别【最原始的数据类型】,Type和Kind可能相同,也可能不同
Eg: var num int = 10,num的Type是int,Kind也是int
Eg: var stu Student,stu 的Type是model.Student,Kind是struct
reflect.TypeOf(变量名):获取变量的类型,返回reflect.Type类型
reflect.ValueOf(变量名):获取变量的值,返回reflect.Value类型reflect.Value,是⼀个结构体类型
两种⽅式可以获取到Kind
reflect.TypeOf(变量名).Kind()
reflect.ValueOf(变量名).Kind()
注意:如果传⼊的interface是10,那么它的值类型是reflect.Value,不等同于int,如果进⾏运算,需要先
2、变量、interface{},reflect.Value相互转化
上述将interface{}转化成需要类型的⽅式除了断⾔(加⼊对返回值的判断)外还可以采⽤switch⽅式
李林甫口蜜腹剑
interface{} -> reflect.Value:rValue := reflect.ValueOf(b) reflect.Value -> interface{}:iV := rValue.Interface()
interface{} -> 变量:num3 := iV.(int)
3、反射获取结构体内容
获取结构体字段
获取⽅法并调⽤:
修改值:
4、反射最佳实践
type Monster struct {
Name  string  `json:"name"`
Age  int    `json:"monster_age"`
Score float32 `json:"成绩"`
Score float32 `json:"成绩"`
Sex  string
}
工作成果怎么写//返回两个数的和
func (s Monster) GetSum(n1, n2 int) int {
return n1 + n2
}
//接收四个值,给s赋值
func (s Monster) Set(name string, age int, score float32, x string) {
s.Name = name
销售绩效考核s.Age = age
s.Score = score
s.Sex = x
}
//显⽰s的值
func (s Monster) Print() {
fmt.Println("----start----")
fmt.Println(s)
fmt.Println("----end----")
}
//使⽤反射获取结构体内容
func TestStruct(a interface{}) {
typ := reflect.TypeOf(a)
val := reflect.ValueOf(a)
kd := val.Kind()
if kd != reflect.Struct {
fmt.Println("expect struct")
return
}
//获取到该结构体有⼏个字段
num := val.NumField()
fmt.Printf("struct has %d fields\n", num)
//变量结构体的所有字段
for i := 0; i < num; i++ {
fmt.Printf("Filed %d:值为=%v\n", i, val.Field(i))
//获取到struct标签:注意需要通过reflect.Type来获取tag
tagVal := typ.Field(i).Tag.Get("json")
//如果该字段属于tag标签就显⽰,否则就不显⽰
if tagVal != "" {
fmt.Printf("Filed %d:tag 为=%v\n", i, tagVal)
吐司怎么做
}
木瓜炖汤
}
//获取到该结构体有多少个⽅法
《为人师表》numOfMethod := val.NumMethod()
fmt.Printf("struct has %d methods\n", numOfMethod)
//var  params []reflect.Value烧杯简笔画
//⽅法的默认顺序是按照函数名的排序
val.Method(1).Call(nil) //获取到第⼆个⽅法,调⽤它
//调⽤结构体的第⼀个⽅法
var params []reflect.Value
params = append(params, reflect.ValueOf(10))
params = append(params, reflect.ValueOf(40))
res := val.Method(0).Call(params) //Call⽅法的参数是 []reflect.Value,返回 []reflect.Value  fmt.Println("res=", res[0].Int()) //返回的结果是[]reflect.Value
}
//修改值
func UpdateStruct(a interface{}) {
val := reflect.ValueOf(a)
val := reflect.ValueOf(a)
val.Elem().Field(0).SetString("⽩象精") }
func main() {
var a Monster = Monster{
Name:  "黄⿏狼精",杭州有什么玩的
Age:  400,
Score: 30.8,
}
TestStruct(a)
UpdateStruct(&a)
fmt.Println(a)
}

本文发布于:2023-07-25 11:46:45,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1096002.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:获取   结构   变量
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图