英文:
Golang a map of functions with a receiver
问题
有没有办法创建一个函数指针的映射,但是这些函数需要接收者?我知道如何在普通函数中实现这个:
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]func() int, 0)
s := someStruct{56}
m["1"] = someFunc
print(s.m["1"]())
}
一个明显的解决方法是将结构体作为参数传递,但这比我想要的要麻烦一些。
英文:
Is there anyway to make a map of function pointers, but functions that take recievers? I know how to do it with regular functions:
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))
}
But can you do that with functions that take recievers? Something like this (though I've tried this and it doesn't work):
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"]())
}
An obvious work around is to just pass the struct as a parameter, but that's a little dirtier than I would have liked
答案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
英文:
You can do that using Method Expressions:
https://golang.org/ref/spec#Method_expressions
The call is a bit different, since the method expression takes the receiver as the first argument.
Here's your example modified:
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))
}
And here's a Go playground for you to test it:
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论