阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

简单介绍Go语言开发框架反射机制及常见函数

30次阅读
没有评论

共计 2601 个字符,预计需要花费 7 分钟才能阅读完成。

导读 这篇文章主要为大家介绍了 Go 语言开发框架反射机制及常见函数示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
基本介绍
  • 反射可以在运行时动态获取变量的各种信息, 比如变量的类型, 类别
  • 如果是结构体变量, 还可以获取到结构体本身的信息
  • 通过反射, 可以修改变量的值, 可以调用关联的方法
  • 使用反射, 需要 import(“reflect”)
  • 示意图

    简单介绍 Go 语言开发框架反射机制及常见函数

    反射中常见函数和概念
    reflect.TypeOf(变量名)

    获取变量的类型, 返回 reflect.Type 类型

    reflect.ValueOf(变量名)

    获取变量的值, 返回 reflect.Value 类型 reflect.Value 是一个结构体类型, 通过 reflect.Value, 可以获取到关于该变量的很多信息

    变量.interface{} 和 reflect.Value 是可以相互转换的

    简单介绍 Go 语言开发框架反射机制及常见函数

    基本使用
    package main
    import (
       "fmt"
       "reflect"
    )
    /*
    1. 编写案例, 对基本数据类型,interface{},reflect.Value 进行反射
    2. 编写案例, 对结构体,interface{},reflect.Value 进行反射
    */
    func reflectTest(b interface{}){
       // 打印出传参的 type,kind,value
       fmt.Printf("b 的类型为 %v,b 的 kind 为 %v,value 为 %v\n",reflect.TypeOf(b),reflect.ValueOf(b).Kind(),reflect.ValueOf(b))    // b 的类型为 int,b 的 kind 为 int,value 为 100
       //reflect.TypeOf(),reflect.ValueOf() 返回的类型
       fmt.Printf("reflect.TypeOf() 返回类型为 %T,reflect.ValueOf() 返回类型为 %T\n",reflect.TypeOf(b),reflect.ValueOf(b)) //reflect.TypeOf() 返回类型为 *reflect.rtype,reflect.ValueOf() 返回类型为 reflect.Value
    }
    type Student struct {
       Name string
       age int
    }
    func reflectTest2(b interface{}){rTyp:=reflect.TypeOf(b)
       fmt.Println(rTyp) //main.Student
       rVal:=reflect.ValueOf(b)
       // 将 rVal 转换成 interface{}
       iV:=rVal.Interface()
       fmt.Printf("iv=%v type=%T\n",iV,iV) //iv={张三 18} type=main.Student
       // 因为 Go 语言是静态语言, 所以不能直接获取结构体中指定的值, 所以我需要将其断言成需要的类型
       stu,ok:=iV.(Student)
       if ok{fmt.Printf(stu.Name,stu.age)  // 张三 %!(EXTRA int=18)
       }
    }
    func main() {//1. 编写案例, 对基本数据类型,interface{},reflect.Value 进行反射
       var num int =100
       reflectTest(num)
       //2. 编写案例, 对结构体,interface{},reflect.Value 进行反射
       stu:=Student{
        Name: "张三",
        age:  18,
       }
       reflectTest2(stu)
    }
    反射注意事项
  • reflect.ValueKind, 获取的变量的类别, 返回的是一个常量
  • Type 是类型,Kind 是类别,Type 和 Kind 可能是相同的, 也可能是不同的, 例如结构体
  • 通过反射可以在让变量在 interface{} 和 reflect.Value 之间相互转换
  • 通过反射的方式获取变量的值 (并返回对应的类型), 要求数据类型匹配, 比如 x 是 int, 那么就应该使用 reflect.Value(x).Int(), 而不能使用其他的, 否则报 panic
  • 通过反射来修改变量, 注意当使用 Setxxx 方法来设置需要通过对应的指针类型来完成, 这样才能改变传入变量的值, 同时需要使用到 reflect.Value.Elem() 方法
  • 反射的最佳实践

    使用反射来遍历结构体的字段, 调用结构体的方法, 并获取结构体标签的值

    package main
    import (
        "fmt"
        "reflect"
    )
    // 定义了一个 Monster 结构体
    type Monster struct {
        Name  string `json:"name"`
        Age   int `json:"monster_age"`
        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, sex string) {
        s.Name = name
        s.Age = age
        s.Score = score
        s.Sex = sex
    }
    // 方法,显示 s 的值
    func (s Monster) Print() {fmt.Println("---start~----")
        fmt.Println(s)
        fmt.Println("---end~----")
    }
    func TestStruct(a interface{}) {
        // 获取 reflect.Type 类型
        typ := reflect.TypeOf(a)
        // 获取 reflect.Value 类型
        val := reflect.ValueOf(a)
        // 获取到 a 对应的类别
        kd := val.Kind()
        // 如果传入的不是 struct,就退出
        if kd !=  reflect.Struct {fmt.Println("expect struct")
            return
        }
        // 获取到该结构体有几个字段
        num := val.NumField()
        fmt.Printf("struct has %d fields\n", num) //4
        // 变量结构体的所有字段
        for i := 0; i 
    

    以上就是 Go 语言开发框架反射机制及常见函数示例详解的详细内容

    阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

    腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

    代金券:在阿里云专用满减优惠券

    正文完
    星哥说事-微信公众号
    post-qrcode
     0
    星锅
    版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计2601字。
    转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
    【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
    阿里云-最新活动爆款每日限量供应
    评论(没有评论)
    验证码
    【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中