這個問題我不知道該怎樣描述,大體意思是,我有一組函數,我想根據傳入的名稱來肯定到底應該執行哪個函數。固然,能夠寫像switch或者 是if else這樣的語句進行判斷,可是,總以爲這樣寫太俗,雖然可以達到預期的結果,可是代碼看起來至關不美觀。其實,原來我只是在意功能,也不會很在乎別人看我代碼的感覺,更不要說可維護性了。只是,近期,組裏常常進行代碼走查,我那代碼五天走了三次,其中這五天還包括了週六日(固然,週六日是正常休息的,個人意思是,代碼走查很頻繁)每次代碼走查,你們都會給我提好多意見,而後最後就總有一種感受:我這幾天白忙活了,全部代碼都被否認了。固然,每次code review以後,也有不少收穫。組裏共四我的,他們三個都是編程經驗豐富的高手,就我菜鳥一隻,因此,我有不少師傅能夠請教呀。他們三個都很好,我遇到不理解的問題,就可着勁的問,每次都說,你能不能講得現實點。最後都會問到實現細節上。因此,雖然代碼常常被否決,我卻能夠在很短的時間內重整旗鼓,從新組織代碼。我如今追求的再也不只是功能完善,而是上了一個臺階,要可讀性強,結構清晰。貌似說遠了哈,繼續剛纔的問題。若是碰到這種須要比較出結果的,在go中,咱們首先想到的固然是map,有一個key值,我就有可能給找一個value值。因此,今天的主題就是講函數做爲map中的value. 編程
package main import ( "fmt" ) type myfunc func(x, y int) func add(x, y int) { fmt.Println(x + y) } func minus(x, y int) { fmt.Println(x - y) } func multiply(x, y int) { fmt.Println(x * y) } var mapfunc = map[string]myfunc{ "add": add, "minus": minus, "multiply": multiply, } func main() { param := "minus" a, b := 5, 7 if ff, ok := mapfunc[param]; ok { ff(a, b) } }
上述代碼是一個比較簡單的例子,目的就是說明作法。關鍵的是要定義一個函數變量,這個貌似與C中的函數指針有些像,type myfunc func(x,y int),函數的形式是用戶自定義的,入參還有返回值,本身定義。其實,能夠將這個函數定義看作是一個接口,在GO中,一個類實現了一個接口不須要顯式定義,只要是實現了這些接口,編譯器會知道。一樣的,在本例中,你自定義的函數能夠隨便命名,只要入參還有返回值與定義中的相同即可以了。最開始的時候,我還有一個疑惑,那參數是怎樣傳遞過去的呢?後來想一想,函數都拿到了,何愁參數怎樣傳進去呢,直接跟上就ok了呀。 數組
今天同事還問我這個事,結果,他給出了更好的方案,不用map,而是用數組,將字符串映射到整數上,直接拿着索引去數組中找函數,還免去了搜索,一步到位,不得不認可,姜仍是老的辣,雖然是很小的一部分,也要力求作到極致。 函數