我想用字符串调用结构的一个字段,所以我 checkout ,发现需要使用反射包。
这是我的代码:
package main
import (
"fmt"
"reflect"
)
type cmd struct{
echo func() (string,error)
}
func main() {
cmd:=cmd{
echo : func () (string,error){
return "test", nil
},
}
fmt.Println(reflect.ValueOf(&cmd).MethodByName("echo").Call([]reflect.Value{}))
}
当我要构建它时,它会像这样:
panic: reflect: call of reflect.Value.Call on zero Value
goroutine 1 [running]:
reflect.flag.mustBe(...)
c:/go/src/reflect/value.go:208
reflect.Value.Call(0x0, 0x0, 0x0, 0xc0000c7f50, 0x0, 0x0, 0x0, 0x0, 0xc000086058)
c:/go/src/reflect/value.go:319 +0x174
我不了解
[]reflect.Value{}
,为什么我需要在行上使用它:reflect.ValueOf(&cmd).MethodByName("echo").Call([]reflect.Value{})
希望有人能帮忙! :D
克里斯
最佳答案
cmd.echo
不是方法。这是功能类型的字段。使用Value.FieldByName()
访问它。
并且只能访问导出的字段,将其重命名为Echo
。
而且您必须传递一个非指针的cmd
,或者,如果传递&cmd
,则必须调用Value.Elem()
。
工作示例:
type cmd struct {
Echo func() (string, error)
}
cmd := cmd{
Echo: func() (string, error) {
return "test", nil
},
}
fmt.Println(reflect.ValueOf(cmd).FieldByName("Echo").Call([]reflect.Value{}))
输出(在Go Playground上尝试):
[test <error Value>]
还要注意,如果函数没有参数,则将
nil
传递给Value.Call()
:reflect.ValueOf(cmd).FieldByName("Echo").Call(nil)
关于string - 在golang中使用字符串调用结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61057114/