栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

通过Go中的反射为结构成员分配值

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通过Go中的反射为结构成员分配值

是的,有可能。

介绍

由于您要访问和修改变量(或字段)的值,因此需要使用

reflect.Value
类型而不是
reflect.Type
。您可以使用获取它
reflect.ValueOf()
。同样,为了通过反射进行修改,您需要传递
struct
要修改的或值的地址(指针)(否则,您只能读取它,而不能修改它)。

但你不希望修改地址/指针,但 尖锐的 价值,所以你必须从“导航”

Value
的指针的
Value
尖头变量(结构),这是什么
Value.Elem()
是。看起来像这样:
reflect.ValueOf(&s).Elem()

您可以使用方法获得

Value
struct字段的
Value.FieldByName()
,因为我们传递了指向
ValueOf()
函数的指针的地址,所以它是
可设置的

代码

一旦理解,该代码比简介简单得多。您也可以在Go
Playground
上尝试一下:

var s struct {    A, B, C string}s.A, s.B, s.C = "a1", "b2", "c3"fmt.Println("Before:  ", s)v := reflect.ValueOf(&s).Elem()v.FieldByName("A").SetString("2a")v.FieldByName("B").SetString("2b")v.FieldByName("C").SetString("2c")fmt.Println("After:   ", s)// Using a map:m := map[string]string{"A": "ma", "B": "mb", "C": "mc"}for mk, mv := range m {    v.FieldByName(mk).SetString(mv)}fmt.Println("From Map:", s)

输出:

Before:   {a1 b2 c3}After:    {2a 2b 2c}From Map: {ma mb mc}

我建议阅读此博客文章,以了解Go语言中反射的基础知识:

反射定律



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/469043.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号