使用方法值
您可以为此目的使用Method values。方法值是具有隐式接收器的函数值。引用Spec: Method values:
如果表达式x具有静态类型T,并且M在T类型的方法集中,则x.M称为方法值。
所以方法值的语法是x.M,例如x是类型的值,M是方法的名称。这会导致函数与没有接收器的方法具有相同的参数(和返回类型),因为接收器将与方法值一起保存并且是隐式的。
因此,这意味着为您的 doSometing() 和 doAnotherThing() 方法存储方法值,函数类型将简单地为 func (int)(无接收器)。
这是一个工作示例:
type mystruct struct {
name string
}
func (my *mystruct) doA(i int) {
fmt.Printf("[doA]: I'm %s, param is: %d\n", my.name, i)
}
func (my *mystruct) doB(i int) {
fmt.Printf("[doB]: I'm %s, param is: %d\n", my.name, i)
}
func main() {
my1 := &mystruct{"Bob"}
my2 := &mystruct{"Alice"}
lookupMap := map[string]func(int){
"action1": my1.doA,
"action2": my2.doB,
}
lookupMap["action1"](11)
lookupMap["action2"](22)
}
输出(在Go Playground上试试):
[doA]: I'm Bob, param is: 11
[doB]: I'm Alice, param is: 22
使用方法表达式
如果您不希望将接收者保存在字典中(在方法值内),您可以使用Method expressions。
不同的是,在获取函数值时,不是使用x.M而是T.M,这样会产生一个函数值,函数类型具有相同的参数(和返回类型),但是接收器类型也将在参数列表中,并且放在首位。参见Spec: Method expressions的引用:
如果M 位于T 类型的方法集中,则T.M 是一个可作为常规函数调用的函数,其参数与M 相同,前缀为附加参数,该参数是方法。
因此,在您的情况下,要使用的函数类型将如下所示:func(*mystruct, int)
另外,由于receiver不会被保存,所以调用这些函数时必须提供。
查看这个工作示例(这是对第一个示例的修改):
type mystruct struct {
name string
}
func (my *mystruct) doA(i int) {
fmt.Printf("[doA]: I'm %s, param is: %d\n", my.name, i)
}
func (my *mystruct) doB(i int) {
fmt.Printf("[doB]: I'm %s, param is: %d\n", my.name, i)
}
func main() {
lookupMap := map[string]func(*mystruct, int){
"action1": (*mystruct).doA,
"action2": (*mystruct).doB,
}
my1 := &mystruct{"Bob"}
my2 := &mystruct{"Alice"}
lookupMap["action1"](my1, 11)
lookupMap["action2"](my2, 22)
}
输出是一样的(在Go Playground上试试):
[doA]: I'm Bob, param is: 11
[doB]: I'm Alice, param is: 22
查看类似问题:
golang - pass method to function
golang function alias on method receiver