繁体   English   中英

如何使用Go中的反射设置一个结构成员,该结构成员是一个指向字符串的指针

[英]How to set a struct member that is a pointer to a string using reflection in Go

我试图使用反射来设置指针。 elasticbeanstalk.CreateEnvironmentInput有一个字段SolutionStackName ,其类型为*string 我尝试设置任何值时收到以下错误:

panic: reflect: call of reflect.Value.SetPointer on ptr Value

这是我的代码:

    ...
newEnvCnf := new(elasticbeanstalk.CreateEnvironmentInput)
checkConfig2(newEnvCnf, "SolutionStackName", "teststring")
    ...
func checkConfig2(cnf interface{}, key string, value string) bool {
    log.Infof("key %v, value %s", key, value)

    v := reflect.ValueOf(cnf).Elem()
    fld := v.FieldByName(key)

    if fld.IsValid() {
        if fld.IsNil() && fld.CanSet() {
            fld.SetPointer(unsafe.Pointer(aws.String(value)))
//aws.String returns a pointer

...

这是日志输出

time="2016-02-20T23:54:52-08:00" level=info msg="key [SolutionStackName], value teststring" 
    panic: reflect: call of reflect.Value.SetPointer on ptr Value [recovered]
        panic: reflect: call of reflect.Value.SetPointer on ptr Value

Value.SetPointer()只能在值的类型为reflect.UnsafePointer (由Value.Kind()报告)中使用,但是你的是reflect.Ptr因此SetPointer()将发生恐慌(如文档所述)。

只需使用Value.Set()方法来更改struct字段的值(它是指针与否,无关紧要)。 它需要一个类型为reflect.Value的参数,你可以通过调用reflect.ValueOf()获得它,并简单地传递参数value的地址:

fld.Set(reflect.ValueOf(&value))

测试它:

type Config struct {
    SolutionStackName *string
}

c := new(Config)
fmt.Println(c.SolutionStackName)
checkConfig2(c, "SolutionStackName", "teststring")
fmt.Println(*c.SolutionStackName)

输出(在Go Playground上试试):

<nil>
teststring

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM