• 【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的具体体现;


    总结

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

  • 相关阅读:
    P2014 [CTSC1997] 选课(树形DP)
    当客户说价格高时我会这样做
    three.js 第一节 - 场景、相机、渲染器
    点到直线的距离直线的交点及夹角
    集群分发脚本xysnc
    java.lang.Enum类下name()方法起什么作用呢?
    从头训练一个神经网络!教它学会莫奈风格作画!
    k8s笔记资源限制,亲和和性 污点和容忍
    MAC 通过IDEA启动tomcat,显示80端口被占用解决办法
    【操作系统】聊聊进程间通信方式
  • 原文地址:https://blog.csdn.net/qfzhangwei/article/details/127859019