写点什么

浅谈 Go 语言反射

作者:Barry Yan
  • 2022-11-22
    北京
  • 本文字数:872 字

    阅读完需:约 3 分钟

浅谈Go语言反射

1 为什么需要反射

反射是框架的灵魂。


反射(Reflection)其实是通过允许在运行时存取程序数据,以改变程序行为的程序设计技术。也就是说,反射可以帮助我们将动态的功能实现或调用变为静态的功能描述。


反射有优点就是可以让程序灵活,更新和维护都更加简单方便,但是反射并不是没有缺点,反射在执行时对于 CPU 和内存资源会进行占用。

2 Go 反射的使用

2.1 针对结构体的反射

type Student struct {   Id   int64   Name string   Age  int}
func TestStruct(t *testing.T) { stu := Student{1, "zs", 12} obj := reflect.ValueOf(stu) field := obj.FieldByName("Name") field1 := obj.Field(0) num := obj.NumField() fmt.Println("字段数量:", num) fmt.Println("Name字段的值:", field) fmt.Println("第0个字段的值:", field1) obj1 := reflect.ValueOf(new(Student)) addr := obj1.CanAddr() //是否能寻址 if addr { fmt.Println(obj1.Addr()) }}
复制代码

2.2 针对常见数据结构的反射

// 切片类型的反射func TestSlice(t *testing.T) {  slice := make([]int, 10)  s := reflect.ValueOf(slice)  //加入元素  s.Index(0).Set(reflect.ValueOf(100))  //获取元素  i := s.Index(0).Interface()  fmt.Println(slice)  fmt.Println(i)}
// Map类型的反射func TestMap(t *testing.T) { m := make(map[string]interface{}) m["A"] = 1 m["B"] = 2 m["C"] = 3 mv := reflect.ValueOf(m) //赋值 mv.SetMapIndex(reflect.ValueOf("D"),reflect.ValueOf(4)) iter := mv.MapRange() keys := mv.MapKeys() fmt.Println(keys) for iter.Next() { fmt.Println(iter.Value()) }}
复制代码

3 小总结

反射在架构中扮演者很重要的作用,其中最重要的就是增强架构的抽象,Go 语言反射里最重要的两个概念是 Type 和 Value,Type 用于获取类型相关的信息(比如 slice 的长度,Struct 的成员,函数的参数),Value 用于获取和修改原始数据的值(比如修改 slice 和 map 中的元素,修改 Struct 的成员变量)。


参考:


https://zhuanlan.zhihu.com/p/411313885

发布于: 刚刚阅读数: 4
用户头像

Barry Yan

关注

做兴趣使然的Hero 2021-01-14 加入

Just do it.

评论

发布
暂无评论
浅谈Go语言反射_Go_Barry Yan_InfoQ写作社区