Golang中一个带有接收器的函数映射

4
有没有办法制作一个函数指针映射表,但是这些函数需要接收者?我知道如何处理常规函数:
package main

func someFunc(x int) int {
    return x
}

func main() {
    m := make(map[string]func(int)int, 0)
    m["1"] = someFunc
    print(m["1"](56))
}

但是你能用需要接收器的函数来做到这一点吗?就像这样(尽管我尝试过这个,但它不起作用):
package main

type someStruct struct {
    x int
}

func (s someStruct) someFunc() int {
    return s.x
}

func main() {
    m := make(map[string](someStruct)func()int, 0)
    s := someStruct{56}
    m["1"] = someFunc
    print(s.m["1"]())
}

一个显而易见的解决方法是将结构体作为参数传递,但这比我想象中要麻烦一些。

1
不,这些方法不是自由浮动的函数,您不能在没有关联实例的情况下引用方法,并且您不能将其针对不同的实例执行。但是您可以使用反射来实现这一点。 - Adrian
1
实际上,您可以在没有关联实例的情况下引用方法:https://golang.org/ref/spec#Method_expressions。请参见我的答案以获取示例。 - eugenioy
1个回答

7
您可以使用方法表达式来做到这一点: https://golang.org/ref/spec#Method_expressions 由于方法表达式将接收器作为第一个参数,因此调用略有不同。
下面是您的示例修改后的代码:
package main

type someStruct struct {
    x int
}

func (s someStruct) someFunc() int {
    return s.x
}

func main() {
    m := make(map[string]func(someStruct)int, 0)
    s := someStruct{56}
    m["1"] = (someStruct).someFunc
    print(m["1"](s))
}

以下是一个Go Playground,供您测试:

https://play.golang.org/p/PLi5A9of-U


注意:请不要修改任何HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接