为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 反射值行为

Golang 反射值行为

Go
翻阅古今 2021-06-15 21:01:51
我目前对 golangs 反射包的行为感到绝望,这对我来说似乎根本不一致。1)据我所知,reflect.Value 似乎带有一个指向底层值的指针。例如,如果我打电话var s stringv1 := reflect.ValueOf(&s).Elem()v2 := v1v2.SetString("Hello World!")fmt.Println(s)它打印我“Hello World!”。然而,这似乎不适用于通过调用 Field() 获得的reflect.Value。val := ... //Assign a reflect.Value to itnextval := val.Field(0) //Make sure that Field exists and is of type mapnextval = reflect.MakeMap(reflect.MapOf(KEY, ELEM))nextval.SetMapIndex(Some_value_of_type_KEY, Something_of_type_ELEM)fmt.Println(nextval.MapKeys()fmt.Println(val.Field(index).MapKeys())这打印[Some_value_of_type_KEY][]这是一个主要的烦恼。有谁知道为什么会这样?================================================== =2)考虑功能func Test(v interface{}) {    val := reflect.ValueOf(v)    if val.Kind() != reflect.Struct {        fmt.Println("It is a struct")    }}如果我用任何结构作为参数调用它,它会打印“这是一个结构”。但是,由于值不可寻址,我将无法使用 val 为 v 中的内容分配新值。通过以下方式解决:func Test(v interface{}) {    val := reflect.ValueOf(&v).Elem()    if val.Kind() != reflect.Struct {        fmt.Println("This never get's printed!")    }}根据文档,我会假设,通过使用 '&' 我使用指向 v 的指针,并通过调用 Elem() 我得到它指向的元素,因此 val.Kind() 应该仍然返回相同的东西. 它没有。val.Kind() 现在是一个reflect.Interface。有没有不用去的方法valForTestingKind := reflect.ValueOf(v)valForSettingNewValue := reflect.ValueOf(&v).Elem()因为这在某种程度上感觉不对。
查看完整描述

3 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

我想谈谈你的第二个代码块:


val := ... //Assign a reflect.Value to it

nextval := val.Field(0) //Make sure that Field exists and is of type map

nextval = reflect.MakeMap(reflect.MapOf(KEY, ELEM))

nextval.SetMapIndex(Some_value_of_type_KEY, Something_of_type_ELEM)

fmt.Println(nextval.MapKeys()

fmt.Println(val.Field(index).MapKeys())

在第三行,您将一个新的、不同的对象重新分配给变量nextval。你不应该在 nextval 上调用某种设置方法而不是重新分配它吗?在您的第一个示例中,您调用了SetString但在本示例中您只是重新分配了变量,这可能就是行为不同的原因。重新分配变量后,nextval将不再以任何方式连接到val.Field(0). 另外,什么是index?


如果这不能解释您的问题,请编辑问题以包含一个简短的、独立的、正确的、可编译的示例 ( SSCCE )。我希望能够将其发布到golang.org首页的文本框中以便查看问题。如果可能,您应该始终发布 SSCCE。


查看完整回答
反对 回复 2021-06-21
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

您尚未展示完整且可编译的代码。你是传递一个指向结构的指针还是按值传递结构?在后一种情况下,反射不能改变它。


查看完整回答
反对 回复 2021-06-21
  • 3 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信