pointers - Go中通过反射修改struct中的空指针字段

标签 pointers go reflection null

我试图通过反射循环修改空指针字段“MyField”的间接值。 我感到 panic :反射(reflect):在零值上调用 reflect.Value.Set。

有什么想法吗?

https://play.golang.org/p/IJvA_J_cD60

package main

import (
    "fmt"
    "reflect"
)

type MyStruct struct {
    MyField *string
}

func main() {
    s := MyStruct{}

    v := reflect.ValueOf(s)

    for i := 0; i < v.NumField(); i++ {
        valueField := v.Field(i)
        fieldName := v.Type().Field(i).Name
        if fieldName == "MyField" && valueField.Kind() == reflect.Ptr {
            valueField.Elem().Set(reflect.ValueOf("some changed name"))
            fmt.Printf("the elem after change: %v\n", valueField.Elem())
        }

    }
    fmt.Print(*s.MyField)
}

非常感谢!

最佳答案

程序有两个问题。

无法设置该字段,因为 v 不是可寻址的值。要获取可寻址值,请从指向 s 的指针创建一个 reflect.Value:

s := MyStruct{}
v := reflect.ValueOf(&s).Elem()

程序试图通过一个 nil 指针设置一个值。反射(reflect)代码与 *s.MyField = "some changed name" 相同。如果问题中的 MyField 为 nil,则此语句将 panic。要解决此问题,请在该字段中设置一个指针:

t := "some changed name"
valueField.Set(reflect.ValueOf(&t))

Run it on the Playground

关于pointers - Go中通过反射修改struct中的空指针字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54594333/

相关文章:

C 使用字符指针

c++ - 带/不带类的回调函数指针 C++

go - 如何在没有第三方 pkg 的情况下为文本设置颜色

debugging - 在vs-code中调试go-lang时如何指定生成的调试二进制文件的路径

unit-testing - 在 Go 包中将用于测试的共享代码放在哪里?

java - 从java中选定文件的类获取方法

loops - 离开循环后指针变为 nil

c - 如何在 C 程序中声明、定义和调用函数,该函数必须具有 1 )"fill"3D 数组和 2 )"read"3D 字符数组

java - Caused by : java. lang.ClassCastException : java. lang.Class无法转换为java.lang.reflect.ParameterizedType

c# - 反射类获取任何对象的所有属性