美文网首页
go reflect

go reflect

作者: hehehehe | 来源:发表于2022-03-28 16:00 被阅读0次
1 、从接口变量到反射对象的转换,需要提到 reflect 包里很重要的两个方法

reflect.TypeOf(i) :获得接口值的类型
reflect.ValueOf(i):获得接口值的值

func main() {
    var age interface{} = 25

    fmt.Printf("原始接口变量的类型为 %T,值为 %v \n", age, age)

    t := reflect.TypeOf(age)
    v := reflect.ValueOf(age)

    // 从接口变量到反射对象
    fmt.Printf("从接口变量到反射对象:Type对象的类型为 %T \n", t)
    fmt.Printf("从接口变量到反射对象:Value对象的类型为 %T \n", v)

}
2、从反射对象到接口变量的转换
func main() {
    var age interface{} = 25

    fmt.Printf("原始接口变量的类型为 %T,值为 %v \n", age, age)

    t := reflect.TypeOf(age)
    v := reflect.ValueOf(age)

    // 从接口变量到反射对象
    fmt.Printf("从接口变量到反射对象:Type对象的类型为 %T \n", t)
    fmt.Printf("从接口变量到反射对象:Value对象的类型为 %T \n", v)

    // 从反射对象到接口变量
    i := v.Interface()
    fmt.Printf("从反射对象到接口变量:新对象的类型为 %T 值为 %v \n", i, i)

}

最后转换后的对象,静态类型为 interface{} ,如果要转成最初的原始类型,需要再类型断言转换一下
i := v.Interface().(int)

3、settable (可设置性,或可写性)的概念

在反射的规则里

  • 不是接收变量指针创建的反射对象,是不具备『可写性』的
  • 是否具备『可写性』,可使用 CanSet() 来获取得知
  • 对不具备『可写性』的对象进行修改,是没有意义的,也认为是不合法的,因此会报错。
func main() {
    var name string = "abc"

    v := reflect.ValueOf(name)
    fmt.Println("可写性为:", v.CanSet())
}

要让反射对象具备可写性,需要注意两点

  • 创建反射对象时传入变量的指针
  • 使用 Elem()函数返回指针指向的数据
func main() {
    var name string = "abc"
    fmt.Println("真实世界里 name 的原始值为:", name)

    v1 := reflect.ValueOf(&name)
    v2 := v1.Elem()

    v2.SetString("cba")
    fmt.Println("通过反射对象进行更新后,真实世界里 name 变为:", name)
}
4、反射函数

1、Kind()
Kind() 方法返回对应的接口变量的基础类型

reflect.TypeOf(m).Kind()
reflect.ValueOf(m).Kind()

2、NumField() 和 Field()

func main() {
    p := Person{"写代码的明哥", 27, "male"}

    v := reflect.ValueOf(p)

    fmt.Println("字段数:", v.NumField())
    fmt.Println("第 1 个字段:", v.Field(0))
    fmt.Println("第 2 个字段:", v.Field(1))
    fmt.Println("第 3 个字段:", v.Field(2))

    fmt.Println("==========================")
    // 也可以这样来遍历
    for i:=0;i<v.NumField();i++{
        fmt.Printf("第 %d 个字段:%v \n", i+1, v.Field(i))
    }
}

3、NumMethod() 和 Method()

func main() {
    p := &Person{"写代码的明哥", 27, "male"}

    t := reflect.TypeOf(p)

    fmt.Println("方法数(可导出的):", t.NumMethod())
    fmt.Println("第 1 个方法:", t.Method(0).Name)
    fmt.Println("第 2 个方法:", t.Method(1).Name)

    fmt.Println("==========================")
    // 也可以这样来遍历
    for i:=0;i<t.NumMethod();i++{
       fmt.Printf("第 %d 个方法:%v \n", i+1, t.Method(i).Name)
    }
}

相关文章

  • golang中类型原型slice struct array st

    type.go src/reflect/value.go

  • 2018-05-02 Go Reflect

    转载自: Go Reflect 最近在看一些go语言标准库以及第三方库的源码时,发现go的reflect被大量使用...

  • Go reflect

    reflection 反射(reflection)是程序在运行时通过检查其定义的变量和值获得对应的真实类型。 在计...

  • go reflect

    1 、从接口变量到反射对象的转换,需要提到 reflect 包里很重要的两个方法 reflect.TypeOf(i...

  • Golang Tip:判断两个类型之间是否能转换

    主要用到Go语言的反射(reflect)。reflect.Type接口有一个方法ConvertibleTo就是判断...

  • 什么是amino编码

    1. Reflect反射 1.1 关于go的reflect 现代通用编程语言中,有的语言支持反射,有的不支持。并且...

  • 1-reflect.Type

    1 实现文件 gofrontend\libgo\go\reflect\type.gogofrontend\libg...

  • GO: reflect包

    在 reflect 包中,主要通过两个函数 TypeOf() 和 ValueOf() 实现反射,TypeOf() ...

  • go反射reflect

    如图定义一个结构体: 反射基本使用 代码: 反射获取结构体cat中的字段值与tag值 测试: 根据类型创建对象 根...

  • 《Go语言四十二章经》第二十七章 反射(reflect)

    《Go语言四十二章经》第二十七章 反射(reflect) 作者:李骁 27.1 反射(reflect) 反射是应用...

网友评论

      本文标题:go reflect

      本文链接:https://www.haomeiwen.com/subject/uoppjrtx.html