Methods 围棋中的方法图
在某些情况下,我会调用几种方法(如添加、删除等)。然而,随着时间的推移,案例数量不断增加,我的开关案例也越来越长。所以我想我应该创建一个方法图,比如;这里函数的映射很简单。但是,是否可以在Go中创建方法映射 当我们有一个方法时:Methods 围棋中的方法图,methods,go,Methods,Go,在某些情况下,我会调用几种方法(如添加、删除等)。然而,随着时间的推移,案例数量不断增加,我的开关案例也越来越长。所以我想我应该创建一个方法图,比如;这里函数的映射很简单。但是,是否可以在Go中创建方法映射 当我们有一个方法时: func (f *Foo) Add(a string, b int) { } 下面的语法创建编译时错误: actions := map[string]func(a, b){ "add": f.Add(a,b), } 是否可以在Go中创建方法映射?目前
func (f *Foo) Add(a string, b int) { }
下面的语法创建编译时错误:
actions := map[string]func(a, b){
"add": f.Add(a,b),
}
是否可以在Go中创建方法映射?目前无法将receiver和method存储在单个值中(除非将其存储在结构中)。这是目前正在进行的工作,它可能会随着Go 1.1而改变(请参阅) 但是,您可以将一种方法分配给函数值(无接收器),然后将接收器传递给该值:
package main
import "fmt"
type Foo struct {
n int
}
func (f *Foo) Bar(m int) int {
return f.n + m
}
func main() {
foo := &Foo{2}
f := (*Foo).Bar
fmt.Printf("%T\n", f)
fmt.Println(f(foo, 42))
}
此值可以像其他任何内容一样存储在地图中。是。目前:
actions := map[string]func(a string, b int){
"add": func(a string, b int) { f.Add(a, b) },
}
稍后:请参阅提到的go11func文档guelfi。您可以使用方法表达式执行此操作: 但是,这使函数将接收器作为第一个参数:
actions := map[string]func(Foo, string, int){
"add": Foo.Add
}
类似地,您可以使用
(*Foo)获得签名为func(*Foo,string,int)
的函数。如果要使用指向类型Foo的指针作为接收器,请添加,如:
func(f*Foo)Add(一个字符串,b int){
然后可以将字符串映射到函数(*Foo,string,int),如下所示:
var operations=map[string]func(*Foo,string,int){
“添加”:(*Foo)。添加,
“删除”:(*Foo)。删除,
}
那么您可以将其用作:
var foo foo=。。。
var op string=GetOp()/“添加”、“删除”、。。。
操作[op](&foo,a,b)
其中GetOp()。
a
和b
是方法的字符串和int参数
这假设所有方法都具有相同的签名。它们也可以有返回值,同样是相同类型的返回值
也可以使用Foo
作为接收器而不是*Foo
来执行此操作。在这种情况下,我们不必在地图中取消引用它,我们通过foo
而不是&foo
你想只存储函数还是同时存储函数和特定接收器?没有接收器,方法基本上是无用的,因此我想我肯定需要接收器。否则,我如何调用f.add(a,b)?好吧,在使用map时,可以动态地传递接收方,因为在map[string]func/method中,在一些浮动在intertube周围的源中,它似乎是一个糟糕的接口变体。希望情况不一样。@roy谢谢。我想MethodByName是我真正想要的。我可以把它包装成一个函数,直接用字符串调用每个方法。因为func(f*Foo)Bar(m int)
与func Bar(f*Foo,m int)
是一样的。太棒了!我非常喜欢这样(创建一个调用该方法的func)。非常感谢你。顺便说一句,我这样称呼它:actions[“add](a,b)
。它应该是actions[“add”](a,b)