2013-02-26 35 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