使用Go 的強型別系統,採用介面{}型鍵的對應的函式無法套用於對應具有int 型別的鍵。雖然Go 目前不支援泛型,但我們可以透過多種方式實作泛型Keys 函數:
如果我們希望保留Map 的類型,我們可以修改Keys 函數以採用map[int]interface{} 參數並將鍵明確轉換為interface{}:
func Keys(m map[int]interface{}) []interface{} { keys := make([]interface{}, len(m)) i := 0 for k := range m { keys[i] = k i++ } return keys }
或者,我們可以使用Go的反射包來存取地圖的鍵並將它們轉換為interface{}。但是,這種方法可能會對效能產生影響:
func Keys(m interface{}) []interface{} { t := reflect.TypeOf(m) if t.Kind() != reflect.Map { panic("argument must be a map") } keys := make([]interface{}, 0) for _, key := range reflect.ValueOf(m).MapKeys() { keys = append(keys, key.Interface()) } return keys }
為了避免潛在的效能問題,我們可以定義一個通用輔助函數來轉換映射[ int]interface{} 到map[interface{}]interface{}:
func convertMap[K1 comparable, V1 any, K2 comparable, V2 any](m map[K1]V1) map[K2]V2 { ret := make(map[K2]V2, len(m)) for k, v := range m { ret[k.(K2)] = v.(V2) } return ret } // Keys returns the keys of the provided map. func Keys[K comparable, V any](m map[K]V) []K { keys := make([]K, len(m)) i := 0 for k := range m { keys[i] = k i++ } return keys }
透過這些輔助函數,我們可以使用以下程式碼:
m2 := map[int]interface{}{ 2: "string", 3: "int", } convertedMap := convertMap(m2) result := Keys(convertedMap) fmt.Println(result)
以上是如何在 Go 中有效率地從 Map 檢索 Key?的詳細內容。更多資訊請關注PHP中文網其他相關文章!