Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Methods 围棋中的方法图_Methods_Go - Fatal编程技术网

Methods 围棋中的方法图

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中创建方法映射?目前

在某些情况下,我会调用几种方法(如添加、删除等)。然而,随着时间的推移,案例数量不断增加,我的开关案例也越来越长。所以我想我应该创建一个方法图,比如;这里函数的映射很简单。但是,是否可以在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)