美文网首页
Golang 反射个人理解

Golang 反射个人理解

作者: Good_Nine9 | 来源:发表于2021-05-06 14:51 被阅读0次

(value) Elem()

如果value是空接口类型,返回其具体的值
如果是指针,返回指向的内容

(type) Elem()

如果type是array、chanel、slice,返回其元素type
如果是map,返回 v 的type
如果是指针,返回指向内容的type

Indirect()

如果是指针,返回其指向的值
如果不是指针的话,返回Elem()

func Indirect(v Value) Value {
    if v.Kind() != Ptr {
        return v
    }
    return v.Elem()
}

用反射修改一个对象的值

这里遇到了一个小坑,那就是当对象没有暴露出来的时候(首字母没有大写),会失败,出现这个错误 panic: reflect: reflect.Value.SetInt using value obtained using unexported field

type Geek struct {
    A int `tag1:"First Tag" tag2:"Second Tag"`
    B string
}

f := Geek{A: 10, B: "Number"}
fmt.Println(f)
// {10 Number}

// 必须传址,传值无法修改
fval := reflect.ValueOf(&f)

// 如果没有Elem()的话,会panic: reflect: call of reflect.Value.Field on ptr Value
fval.Elem().Field(0).SetInt(14)
fval.Elem().Field(1).SetString("fads")
fmt.Println(f)
// {14 fads}

New()

有点等同于reflect.ValueOf(&value)但是用法不一样。
要传入一个reflect.Type,构建出一个新的对象,可以set值进去。
example

type Geek struct {
    A int `tag1:"First Tag" tag2:"Second Tag"`
    B string
}

f := Geek{A: 10, B: "Number"}

// 拿到 Type
fType := reflect.TypeOf(f)
// 创建新对象
fVal := reflect.New(fType)
// 可以设置值
fVal.Elem().Field(0).SetInt(20)
fVal.Elem().Field(1).SetString("Number")

Addr()

拿到被反射对象的地址,一般是用 .Addr().Interface() 这样用的

f := Geek{A: 10, B: "Number"}
fmt.Println(uintptr(unsafe.Pointer(&f)))
// 824634400800
fval := reflect.ValueOf(&f).Elem()
s := fval.Addr().Pointer()
// 824634400800
k := fval.Addr().Interface()
fmt.Println(s == &f)
// true

相关文章

  • Golang 反射个人理解

    (value) Elem() 如果value是空接口类型,返回其具体的值如果是指针,返回指向的内容 (type) ...

  • Golang 反射实现依赖注入

    Golang 反射实现依赖注入 Coding/Golang #Golang #Golang/reflect 依赖注...

  • Golang的反射reflect深入理解和示例

    [TOC] Golang的反射reflect深入理解和示例 【记录于2018年2月】 编程语言中反射的概念 在计算...

  • 关于反射

    Golang的反射reflect深入理解和示例 编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够...

  • golang反射用法举例(注册插件)

    有关golang反射的内容,网上有大量讲述,请自行google——"golang反射三法则" 下面主要反射在实际中...

  • 深入理解Golang反射

    反射 计算机中提到的反射一般是指,程序借助某种手段检查自己结构的一种能力,通常就是借助编程语言中定义的类型(typ...

  • 反射 reflection golang

    原文链接:反射reflection-GOLANG

  • 如何理解 Golang 中的反射

    欢迎访问博客原文:http://pengtuo.tech/golang/2019/09/23/golang-ref...

  • Golang 反射

    基本了解 在Go语言中,大多数时候值/类型/函数非常直接,要的话,定义一个。你想要个Struct 你想要一个值,你...

  • golang 反射

    反射机制是指在程序运行的时候动态地获取对象的属性后者调用对象方法的功能。golang 支持反射,原生的 json ...

网友评论

      本文标题:Golang 反射个人理解

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