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

使用reflect,如何设置结构字段的值?

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

使用reflect,如何设置结构字段的值?

Go是开放源代码。了解反射的一个好方法是查看核心Go开发人员如何使用它。例如,Go
fmt和json包。软件包文档在“软件包文件”标题下具有指向源代码文件的链接。

Go json程序包将JSON从Go结构中封送和解组。


这是一个分步示例,它

struct
在谨慎地避免错误的同时设置字段的值。

Go

reflect
软件包具有一个
CanAddr
功能。

func (v Value) CanAddr() bool

如果可以通过Addr获取值的地址,则CanAddr返回true。这样的值称为可寻址的。如果值是切片的元素,可寻址数组的元素,可寻址结构的字段或取消引用指针的结果,则该值是可寻址的。如果CanAddr返回false,则调用Addr会惊慌。

Go

reflect
程序包具有一个
CanSet
函数,如果有的话
true
,意味着它
CanAddr
也为
true

func (v Value) CanSet() bool

如果v的值可以更改,则CanSet返回true。值只能是可寻址的,并且不是通过使用未导出的结构字段获得的,才可以更改。如果CanSet返回false,则调用Set或任何特定于类型的setter(例如SetBool,SetInt64)都会感到恐慌。

我们需要确保我们能做到

Set
这一点
struct
。例如,

package mainimport (    "fmt"    "reflect")func main() {    type t struct {        N int    }    var n = t{42}    // N at start    fmt.Println(n.N)    // pointer to struct - addressable    ps := reflect.ValueOf(&n)    // struct    s := ps.Elem()    if s.Kind() == reflect.Struct {        // exported field        f := s.FieldByName("N")        if f.IsValid() { // A Value can be changed only if it is  // addressable and was not obtained by  // the use of unexported struct fields. if f.CanSet() {     // change value of N     if f.Kind() == reflect.Int {         x := int64(7)         if !f.OverflowInt(x) {  f.SetInt(x)         }     } }        }    }    // N at end    fmt.Println(n.N)}Output:427

如果可以确定所有错误检查都是不必要的,则该示例将简化为:

package mainimport (    "fmt"    "reflect")func main() {    type t struct {        N int    }    var n = t{42}    fmt.Println(n.N)    reflect.ValueOf(&n).Elem().FieldByName("N").SetInt(7)    fmt.Println(n.N)}


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

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

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