我有这个完美运行的代码:package mainimport ( "fmt")var funcMap = map[string]interface{}{ "hello": hello,}func main() { callDynamically("hello")}func callDynamically(name string) { funcMap[name].(func())()}func hello() { fmt.Println("hello")}但是如果我尝试hello()像这样定义我的结构类型,我的大脑会发疯:package mainimport ( "fmt")type myType struct { field1 string field2 string funcMap map[string]interface{}}func main() { mt := &myType{ field1: "qwe", field2: "asd", funcMap: map[string]interface{}{ "hello": (*myType).hello, }, } mt.callDynamically("hello")}func (mt *myType) callDynamically(name string) { mt.funcMap[name].(func())()}func (mt *myType) hello() { fmt.Println("hello")}https://play.golang.org/p/pPvmaL22_Td我收到了这个错误:panic: interface conversion: interface {} is func(*main.myType), not func()func()当我的函数在callDynamically自定义结构类型上定义时,我真的不明白如何调用。有什么帮助吗?谢谢你。
2 回答
ABOUTYOU
TA贡献1812条经验 获得超5个赞
Go 中的方法只是一个添加了一些语法糖的函数。接收者实际上是函数的第一个参数,因此(*myType).hello- 来自类型的方法 - 实际上是func(*myType); 它没有要调用的接收器实例,因此如果不显式提供一个作为函数参数,就无法调用它。这在 Method Expressions 的规范中有所介绍。
如果您改为从该类型的实例中获取方法,则该参数将已被填充,因此:
foo := &myType{}
fn := foo.hello这fn是func()因为它已经有一个实例可以用作接收器。这在 Method Values 的规范中有所介绍。
一只甜甜圈
TA贡献1836条经验 获得超5个赞
初始化后添加struct实例函数:funcMapstruct
func main() {
mt := &myType{
field1: "qwe",
field2: "asd",
funcMap: map[string]interface{}{},
}
mt.funcMap["hello"] = mt.hello
mt.callDynamically("hello")
}
- 2 回答
- 0 关注
- 207 浏览
添加回答
举报
0/150
提交
取消
