首頁 >後端開發 >Golang >如何在 Go 中有效率地從 Map 檢索 Key?

如何在 Go 中有效率地從 Map 檢索 Key?

Susan Sarandon
Susan Sarandon原創
2024-12-07 04:18:12502瀏覽

How to Efficiently Retrieve Keys from Maps in Go?

如何在Go 中取得映射鍵

使用Go 的強型別系統,採用介面{}型鍵的對應的函式無法套用於對應具有int 型別的鍵。雖然Go 目前不支援泛型,但我們可以透過多種方式實作泛型Keys 函數:

選項1:轉換Map 類型

如果我們希望保留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
}

選項2:使用反射

或者,我們可以使用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
}

選項3:定義通用輔助函數

為了避免潛在的效能問題,我們可以定義一個通用輔助函數來轉換映射[ 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn