无论如何,是否可以制作函数指针的映射,但是需要接收器的函数?我知道如何使用常规函数来做到这一点:
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))
}
Run Code Online (Sandbox Code Playgroud)
但是你能用接收器的函数做到这一点吗?像这样的东西(虽然我试过这个但它不起作用):
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"]())
}
Run Code Online (Sandbox Code Playgroud)
一个明显的解决方法是将结构作为参数传递,但这比我希望的要脏一点
您可以使用方法表达式来做到这一点:
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))
}
Run Code Online (Sandbox Code Playgroud)
这里有一个 Go 游乐场供您测试:
https://play.golang.org/p/PLi5A9of-U