当前位置: 首页 > news >正文

Go语言~反射

reflect包

  • type name和type kind
  • ValueOf
  • 通过反射获取值
  • 通过反射设置变量的值
package mainimport ("fmt""reflect"
)func reflectType(x interface{}) {obj := reflect.TypeOf(x)fmt.Println(obj, obj.Name(), obj.Kind())fmt.Printf("obj type of %T\n", obj)
}func reflectValue(x interface{}) {v := reflect.ValueOf(x)fmt.Printf("value is a %v, type is a %T\n", v, v)// 如何得到一个传入时候类型的变量k := v.Kind() // 拿到值对应的类型种类switch k {case reflect.Float32:ret := float32(v.Float())fmt.Printf("value is a %v, type is a %T\n", ret, ret)case reflect.Int32:ret := int32(v.Int())fmt.Printf("value is a %v, type is a %T\n", ret, ret)}
}func reflectSetValue(x interface{}) {v := reflect.ValueOf(x)// Elem()用来根据指针取对应的值k := v.Elem().Kind()switch k {case reflect.Int32:v.Elem().SetInt(100)case reflect.Float32:v.Elem().SetFloat(5.678)}
}type Cat struct{}type Dog struct{}func main() {/*var a float32 = 3.1415926reflectType(a)var b int8 = 10reflectType(b)// 结构体类型var c CatreflectType(c)var d DogreflectType(d)// slicevar e []stringreflectType(e)var f []intreflectType(f)*/// valueOf/*var aa int32 = 100reflectValue(aa)var bb float32 = 3.1415926reflectValue(bb)*/// setValuevar cc int32 = 10reflectSetValue(&cc)fmt.Println(cc)
}

isNil()和isValid()

package main// IsNil()常被用于判断指针是否为空;IsValid()常被用于判定返回值是否有效。import ("fmt""reflect"
)type StructField struct {// Name是字段的名字。PkgPath是非导出字段的包路径,对导出字段该字段为""Name      stringPkgPath   stringType      reflect.TypeTag       reflect.StructTagOffset    uintptrIndex     []intAnonymous bool
}func main() {// *int类型空指针var a *intfmt.Println("var a *int IsNil:", reflect.ValueOf(a).IsNil())// nil值fmt.Println("nil IsValid:", reflect.ValueOf(nil).IsValid())// 实例化一个匿名结构体b := struct{}{}// 尝试从结构体中查找"abc"字段fmt.Println("不存在的结构体成员:", reflect.ValueOf(b).FieldByName("abc").IsValid())// 尝试从结构体中查找"abc"方法fmt.Println("不存在的结构体方法:", reflect.ValueOf(b).MethodByName("abc").IsValid())// mapc := map[string]int{}// 尝试从map中查找一个不存在的键fmt.Println("map中不存在的键:", reflect.ValueOf(c).MapIndex(reflect.ValueOf("娜扎")).IsValid())
}

结构体反射

package mainimport ("fmt""reflect"
)// 结构体反射type student struct {Name  string `json:"name" ini:"s_name"`Score int    `json:"score" ini:"s_score"`
}// 给student添加两个方法 Study和Sleep(注意首字母大写)
func (s student) Study() string {msg := "好好学习,天天向上。"fmt.Println(msg)return msg
}func (s student) Sleep() string {msg := "好好睡觉,快快长大。"fmt.Println(msg)return msg
}// 根据反射获取结构体中方法的函数
func printMethod(x interface{}) {t := reflect.TypeOf(x)fmt.Println(t.NumMethod())v := reflect.ValueOf(x)// 因为下面需要拿到具体的方法去调用,所以使用的是值信息for i := 0; i < v.NumMethod(); i++ {methodType := v.Method(i).Type()fmt.Printf("method name:%s\n", t.Method(i).Name)fmt.Printf("method:%s\n", methodType)// 通过反射调用方法传递的参数必须是 []reflect.Value 类型var args = []reflect.Value{}v.Method(i).Call(args) // 调用方法}// 通过方法名获取结构体的方法// t.MethodByName("Sleep") // reflect.Method, boolmethodObj := v.MethodByName("Sleep") // reflect.Valuefmt.Println(methodObj.Type())
}func main() {stu1 := student{Name:  "枫林神",Score: 90,}/*// 通过反射区获取结构体中的所有字段信息t := reflect.TypeOf(stu1)fmt.Printf("name :%v kind :%v\n", t.Name(), t.Kind())// 遍历结构体变量的所有字段for i := 0; i < t.NumField(); i++ {//根据结构体字段的索引取字段filedobj := t.Field(i)fmt.Printf("name:%v type:%v tag:%v\n", filedobj.Name, filedobj.Type, filedobj.Tag)fmt.Println(filedobj.Tag.Get("json"), filedobj.Tag.Get("ini"))}// 根据名字取结构体中的字段filedobj2, ok := t.FieldByName("Score")if ok {fmt.Printf("name:%v type:%v tag:%v\n", filedobj2.Name, filedobj2.Type, filedobj2.Tag)}*/printMethod(stu1)
}
http://www.lryc.cn/news/222251.html

相关文章:

  • 详解交叉验证中【KFold】【Stratified-KFold】【StratifiedShuffleSplit】的区别
  • 数学建模比赛中常用的建模提示词(数模prompt)
  • Spark 新特性+核心回顾
  • STM32 TIM定时器,配置,详解(1)
  • Helix Toolkit:为.NET开发者带来的3D视觉盛宴
  • PHP分类信息网站源码系统 电脑+手机+微信端三合一 带完整前后端部署教程
  • 2023年辽宁省数学建模竞赛B题数据驱动的水下导航适配区分类预测
  • 完蛋!百融云被大阳线包围了!
  • 数据结构 编程1年新手视角的平衡二叉树AVL从C与C++实现③
  • 数据可视化PCA与t-SNE
  • Kubernetes rancher、prometheus、ELK的安装
  • 为什么我们要努力的学习编程?初学编程从哪里开始学起?
  • ffmpeg 从内存中读取数据(或将数据输出到内存)
  • Flink(一)【WordCount 快速入门】
  • 【Redis】hash数据类型-常用命令
  • 【大数据】Apache NiFi 数据同步流程实践
  • git怎么使用 拉取代码
  • Apple :苹果将在明年年底推出自己的 AI,预计将随 iOS 18 一起推出
  • 数据结构-双向链表
  • CV计算机视觉每日开源代码Paper with code速览-2023.11.6
  • GB28181学习(十五)——流传输方式
  • 【Linux】:初识git || centos下安装git || 创建本地仓库 || 配置本地仓库 || 认识工作区/暂存区(索引)以及版本库
  • Vue 3 中,watch 和 watchEffect 的区别
  • 鲜花展示服务预约小程序的效果如何
  • Linux下多个盘符乱的问题处理
  • uniapp小程序使用web-view组件页面分享后,点击没有home小房子解决办法
  • SLAM_语义SLAM相关论文
  • 【技巧】并发读取Mysql数据保证读取到的数据不重复
  • Lavarel异步队列的使用
  • JVM知识分享(PPT在资源里)