ChatGPT解决这个技术问题 Extra ChatGPT

遍历地图的所有键

有没有办法获取 Go 语言映射中所有键的列表?元素的数量由 len() 给出,但如果我有这样的地图:

m := map[string]string{ "key1":"val1", "key2":"val2" };

如何遍历所有键?


D
Dougnukem

https://play.golang.org/p/JGZ7mN0-U-

for k, v := range m { 
    fmt.Printf("key[%s] value[%s]\n", k, v)
}

或者

for k := range m {
    fmt.Printf("key[%s] value[%s]\n", k, m[k])
}

Go language specs for for statements 指定第一个值是键,第二个变量是值,但不必存在。


作为一个可能的问题,请注意迭代的顺序是未定义的。 groups.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ
Sudhir:golang 语言规范明确将映射定义为具有未定义的键顺序。此外,从 Go 1 开始,键顺序在运行之间有意随机化,以防止依赖于任何感知顺序。
请注意,这不是可变迭代,也就是说,删除一个键将需要您重新启动迭代。
同样对于小型数据集,地图顺序可能是可预测的。
a
a8m

以下是获取 slice 映射键的一些简单方法。

// Return keys of the given map
func Keys(m map[string]interface{}) (keys []string) {
    for k := range m {
        keys = append(keys, k)
    }
    return keys
}

// use `Keys` func
func main() {
    m := map[string]interface{}{
        "foo": 1,
        "bar": true,
        "baz": "baz",
    }
    fmt.Println(Keys(m)) // [foo bar baz]
}

Keys 函数是否可以使用任何类型的键来获取映射,而不仅仅是字符串?
func Keys(m map[interface{}]interface{}) (keys []interface{}),@RobertT.McGibbon 您需要更改函数“原型”
@ArielM。这仅适用于确切的类型 map[interface{}]interface{}。 Go 不支持泛型。您不能创建带有 map 参数的函数,该函数接受具有不同键类型的映射。
S
Sridhar

有没有办法获取 Go 语言映射中所有键的列表?

ks := reflect.ValueOf(m).MapKeys()

如何遍历所有键?

使用公认的答案:

for _, k := range m { ... }

我认为您的意思是 for _, k := range v.MapKeys(),因为在您的示例中,k 将是键切片的 int 索引
M
Mohsen

与类型无关的解决方案:

for _, key := range reflect.ValueOf(yourMap).MapKeys() {
    value := yourMap.MapIndex(key).Interface()
    fmt.Println("Key:", key, "Value:", value)
}  

value := s.MapIndex(key).Interface() 中的 s 是什么?
@KwakuBiney 感谢您的关注。我更新了答案。虽然我现在无法测试它。
f
fliX

使用泛型:

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
}