2013-02-26 42 views
4

我有几种方法,我打电话给一些情况下(如添加,删除等..)。然而,随着时间的推移,案件数量在不断增加,我的案例越来越多。所以我想我会创建一个方法图,如Go map of functions;这里函数的映射是微不足道的。但是,是否可以在Go中创建方法的地图?Go中的方法地图

当我们有一个方法:

func (f *Foo) Add(a string, b int) { } 

的语法如下创建编译时错误:

actions := map[string]func(a, b){ 
     "add": f.Add(a,b), 
} 

是否有可能创造地图中去的方法呢?

+0

你想只存储函数还是函数和特定的接收器? – 2013-02-26 13:16:22

+0

没有接收器的方法基本上是无用的,因此我想我绝对需要接收器。否则,我该如何调用f.add(a,b)? – 2013-02-26 13:19:52

+1

那么,你可以在使用地图时动态地传递接收器,如http://stackoverflow.com/questions/8103617/call-a-struct-and-its-method-by-name-in-go – 2013-02-26 13:20:21

回答

8

是的。目前:

actions := map[string]func(a string, b int){ 
     "add": func(a string, b int) { f.Add(a, b) }, 
} 

后来:看到提到的go11func文档guelfi。

+0

太棒了!我真的很喜欢这个(创建一个调用方法的func)。非常感谢你。顺便说一句,我这样调用:'actions [“add](a,b)'。 – 2013-02-26 14:05:20

+0

它应该是'actions [”add“](a,b)' – 2013-02-26 22:18:40

2

目前没有办法将接收器和方法都存储在单个值中(除非将其存储在结构中)。目前正在开发中,它可能会随着Go 1.1而改变(请参阅http://golang.org/s/go11func)。

你可以,但是,分配方法将一个函数值(不带接收器)和接收器传递到后面的值:

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)) 
} 

这个值可以存储在地图任何事情一样。

+1

因为'func(f * Foo)Bar(m int)'与'func Bar(f * Foo,m int)'相同,所以这个方法可行。 – harm 2013-02-26 13:39:23