在 Go 中,映射是將鍵映射到特定值的通用資料結構。然而,可能會出現我們希望利用多個映射的鍵的情況,即使它們的值類型不同。考慮以下程式碼片段:
func main() { mapOne := map[string]int mapTwo := map[string]double mapThree := map[string]SomeStruct useKeys(mapOne) } func useKeys(m map[string]interface{}) { // something with keys here }
在此範例中,我們有三個映射:mapOne 保存整數,mapTwo 儲存雙精確度值,mapThree 包含 SomeStruct 的實例。我們的目標是建立一個 useKeys 函數,它接受帶有字串鍵的映射和由 interface{} 表示的任意值類型。然而,這種設計並沒有達到預期的效果。
在 Go 中,map 和 slice 是通用結構,但它們缺乏協方差。這意味著雖然您可以將map[string]int分配給map[string]interface{}類型的變量,但您無法安全地修改分配的map的值而不導致錯誤。
如果我們只需要取得映射的鍵而不考慮其值類型,我們可以訴諸反射:
func useKeys(m interface{}) { v := reflect.ValueOf(m) if v.Kind() != reflect.Map { fmt.Println("not a map!") return } keys := v.MapKeys() fmt.Println(keys) }
這個解決方案並不像我們想要的那麼優雅,但它可以有效地檢索並列印傳遞給它的任何映射的鍵,而不管包含的值類型如何。
以上是無論值類型為何,如何存取 Go 中的映射鍵?的詳細內容。更多資訊請關注PHP中文網其他相關文章!