第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

如何獲取地圖的鍵

如何獲取地圖的鍵

Go
慕容3067478 2022-03-02 13:31:43
我有一個(gè)名為Keys()獲取地圖所有鍵的函數(shù),代碼如下:func main() {    m2 := map[int]interface{}{        2:"string",        3:"int",    }    fmt.Println(Keys(m2))}func Keys(m map[interface{}]interface{}) (keys []interface{}) {    for k := range m {        keys = append(keys, k)    }    return keys}但我得到了cannot use m2 (type map[int]interface {}) as type map[interface {}]interface {} in argument to KeysGo 是否支持泛型,我應(yīng)該如何修復(fù)我的代碼?
查看完整描述

3 回答

?
慕容森

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊

1- Golang 是強(qiáng)類型語言,所以map[int]interface{}不兼容map[interface{}]interface{}.

int與 不同類型interface{},請參閱:Go:interface{} 的含義是什么?


2- 不,Golang 不支持泛型,這非常好,因?yàn)樗拐Z言簡單快速。


你有一些選擇:


如果您不想更改使用的地圖類型:

1- 您可以將函數(shù)編輯為: func Keys(m map[int]interface{}) []int,就像這個(gè)工作示例代碼:


package main


import "fmt"


func main() {

    m2 := map[int]interface{}{

        2: "string",

        3: "int",

    }

    fmt.Println(Keys(m2))

}


func Keys(m map[int]interface{}) []int {

    keys := make([]int, len(m))

    i := 0

    for k := range m {

        keys[i] = k

        i++

    }

    return keys

}

輸出(可能不按順序):


[2 3]

2-或者您可以將函數(shù)編輯為:func Keys(m map[int]interface{}) []interface{},就像這個(gè)工作示例代碼:


package main


import "fmt"


func main() {

    m2 := map[int]interface{}{

        2: "string",

        3: "int",

    }

    fmt.Println(Keys(m2))

}


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 3]

如果您不想更改Keys使用的功能:

3-您可以將地圖編輯為:map[interface{}]interface{},就像這個(gè)工作示例代碼:


package main


import "fmt"


func main() {

    m2 := map[interface{}]interface{}{

        2: "string",

        3: "int",

    }

    fmt.Println(Keys(m2))

}


func Keys(m map[interface{}]interface{}) []interface{} {

    keys := make([]interface{}, len(m))

    i := 0

    for k := range m {

        keys[i] = k

        i++

    }

    return keys

}

4-您也可以將reflect包用于某些用例,但會降低性能(速度)。


查看完整回答
反對 回復(fù) 2022-03-02
?
一只甜甜圈

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊

除了 Amd 的解決方案,如果您不想更改使用的地圖類型,也可以使用反射庫。


func main() {

    m2 := map[int]interface{}{

        2: "string",

        3: "int",

    }


    k := Keys(m2)


    fmt.Printf("Keys: %v\n", k)

}


func Keys(m interface{}) (keys []interface{}) {

    v := reflect.ValueOf(m)

    if v.Kind() != reflect.Map {

        fmt.Errorf("input type not a map: %v", v)

    }


    for _, k := range v.MapKeys() {

        keys = append(keys, k.Interface())

    }

    return keys


}

請注意,如果您使用此解決方案,則返回的鍵Keys將包含包裝在接口本身中的每個(gè)鍵值。因此,要獲得實(shí)際值,您可能必須執(zhí)行類型斷言:


k := Keys(m2)

k1 := k[0].(int) // k[0] is an interface value, k1 is an int


查看完整回答
反對 回復(fù) 2022-03-02
?
躍然一笑

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊

從 Go 1.18(以測試版發(fā)布)開始,該語言添加了類型參數(shù),您可以輕松編寫如下函數(shù):


func Keys[K comparable, V any](m map[K]V) []K {

    keys := make([]K, 0, len(m))

    for k := range m {

        keys = append(keys, k)

    }

    return keys

}

示例用法:


func main() {

    m := map[int]string{2: "string", 3: "int"}

    keys := Keys(m)

    fmt.Println(keys)                 // [2 3]

    fmt.Println(reflect.TypeOf(keys)) // []int


    m2 := map[string]int{"a": 1, "b": 2}

    keys2 := Keys(m2)

    fmt.Println(keys2)                 // [a b]

    fmt.Println(reflect.TypeOf(keys2)) // []string

}

游樂場:https ://gotipplay.golang.org/p/pdsI2H7w-N4


請注意,根據(jù)當(dāng)前提案,類型參數(shù)的類型約束K是預(yù)先聲明的標(biāo)識符comparable,而不是any.


這是因?yàn)橛成滏I必須支持比較運(yùn)算符。因此,您必須僅限K于可比較的類型。


或者,基于這個(gè)被接受的提議,新的包maps也可以用來完成同樣的事情。但是,這還沒有在標(biāo)準(zhǔn)庫中。相反,它被包含在其中g(shù)olang.org/x/exp,因此它不在 Go 1 兼容性承諾中。


maps.Keys和 上面的函數(shù)之間的區(qū)別在于它maps.Keys被參數(shù)化M(除了K和V),具有近似約束~map[K]V。這允許所有定義的類型與底層map:


type MyMap map[string]int

用法基本相同:


package main


import (

    "fmt"

    "reflect"


    "golang.org/x/exp/maps"

)


func main() {

    m := map[int]string{2: "string", 3: "int"}

    keys := maps.Keys(m)

    fmt.Println(keys)                 // [2 3]

    fmt.Println(reflect.TypeOf(keys)) // []int

}

游樂場:https ://gotipplay.golang.org/p/Bx11jmyifAg


查看完整回答
反對 回復(fù) 2022-03-02
  • 3 回答
  • 0 關(guān)注
  • 183 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號