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包用于某些用例,但會降低性能(速度)。

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

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
- 3 回答
- 0 關(guān)注
- 183 瀏覽
添加回答
舉報(bào)