• 【go】反射系列文章




    前言

    了解反射本质,本文就介绍了反射的基础内容。


    一、go的反射是什么?

    一个变量的本质是一个数据地址和一种数据类型,然后根据这两个变量进行操作即反射;

    二、使用步骤

    1.反射常用方式

    代码如下(示例):

    type Teacher struct {
       Topic string
       Age   int
    }
    
    func main() {
       //s := new(Student)
       s := &Student{Name: "222"}
       fmt.Println(reflect.TypeOf(s))        //  ----> *main.Student
       fmt.Println(reflect.TypeOf(s).Elem()) //  ----> main.Student
       fmt.Println(reflect.TypeOf(*s))       //  ----> main.Student
       v := reflect.ValueOf(s).Elem()        //  (依靠不安全的操作存储器对齐来强制转换)方法将运行时类型和变量转换为反射类型和变量
       v.Field(0).SetString("66")
       // 最后,调用 Interface ()方法将变量从反射状态转换回运行时状态。
       fmt.Printf("%#v\n", v.Interface()) //  ----> main.Student{Name:"66", Age:0}
    
       t := Teacher{}
       fmt.Println(reflect.TypeOf(&t).Elem())
       //fmt.Println(reflect.TypeOf(t).Elem()) panic
       field, _ := reflect.TypeOf(&t).Elem().FieldByName("Topic")
       fmt.Println("field.PkgPath--->", field.PkgPath)
       fmt.Println("field--->", field)
       fmt.Println(reflect.TypeOf(&t).Elem().FieldByName("Age"))
       fmt.Println(reflect.TypeOf(&t))
       fmt.Println(reflect.TypeOf(t).Field(0))
       fmt.Println(reflect.TypeOf(t).Field(0))
       fmt.Println(reflect.TypeOf(t).Name())
       fmt.Println(reflect.TypeOf(t).PkgPath())
       fmt.Println(reflect.TypeOf(t).FieldByName("Topic"))
       
       // 通过指针反射操作 内部实现 *(*string)(v.ptr) = x
       // 即需要通过地址来完成操作
       reflect.ValueOf(&t).Elem().Field(0).SetString("99999")
       fmt.Println("field Value SetString --->", t)
       reflect.ValueOf(t).Field(1)
       fmt.Println("field Value get --->", reflect.ValueOf(t).Field(0))
    }
    

    2.读入数据

    注意反射都是指针方向的操作,所以操作时不要使用copy值,而应该使用指针类型;总之反射=op(指针,type); 而运行时变量==interface==address+type的具体体现;


    总结

    以上就是今天要讲的内容,本文仅仅简单介绍了反射的使用

  • 相关阅读:
    从Overleaf提交到arxiv
    CPU设计(单周期和流水线)
    strncpy很危险,但是为什么VS2005还支持它?
    基于GA优化算法的磁性贴片位置布置优化算法matlab仿真
    使用原生 cookieStore 方法,让 Cookie 操作更简单
    Day12--优化分类页面的效果
    Docker&Kubernetes ❀ Service下Port端口区分
    Makefile
    这些提高摸鱼效率的自动化测试技巧,提高打工人幸福感~
    Python与Conda创建虚拟环境
  • 原文地址:https://blog.csdn.net/qfzhangwei/article/details/127859019