[英]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.