在 Go 中,map 是可以儲存鍵值對的通用資料結構。有時,將函數儲存在映射中很有用,允許基於鍵進行動態呼叫。
問題:
假設您有多個函數並想要建立一個映射,其中鍵是函數名稱,值是函數本身。但是,當嘗試執行此操作時,如下所示,您會遇到錯誤:
func a(param string) {} m := map[string]func{} 'a_func': a, } for key, value := range m { if key == 'a_func' { value(param) } }
解決方案:
出現此問題的原因是定義特定於類型的映射的語法是不正確的。要解決此問題,您可以使用語法 map[string]interface{} 代替,因為值不強制類型安全。下面的修改範例說明如何儲存和呼叫映射中的函數:
package main import "fmt" func f(p string) { fmt.Println("function f parameter:", p) } func g(p string, q int) { fmt.Println("function g parameters:", p, q) } func main() { m := map[string]interface{}{ "f": f, "g": g, } for k, v := range m { switch k { case "f": v.(func(string))("astring") case "g": v.(func(string, int))("astring", 42) } } }
在此範例中,映射 m 將兩個函數值儲存為 interface{}。當根據 key 呼叫函數時,會執行類型斷言,將介面值轉換為正確的函數類型。
以上是Go中如何使用Map動態儲存和呼叫函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!