在 Go 语言中,map 是无序的,因此需要使用其他数据结构来实现有序遍历。以下是几种可用的方法:
- 使用 slice 存储 map 的 key,并对 key 进行排序,然后遍历 slice 获取对应的 value。
m := map[string]string{
"a": "apple",
"b": "banana",
"c": "cat",
}
keys := make([]string, len(m))
i := 0
for k := range m {
keys[i] = k
i++
}
sort.Strings(keys)
for _, k := range keys {
fmt.Println(k, m[k])
}
- 使用结构体存储 map 的 key 和 value,并对结构体进行排序,然后遍历结构体获取值。
type KeyValue struct {
Key string
Value string
}
type KeyValueList []KeyValue
func (kvl KeyValueList) Len() int { return len(kvl) }
func (kvl KeyValueList) Less(i, j int) bool { return kvl[i].Key < kvl[j].Key }
func (kvl KeyValueList) Swap(i, j int) { kvl[i], kvl[j] = kvl[j], kvl[i] }
m := map[string]string{
"a": "apple",
"b": "banana",
"c": "cat",
}
kvlist := make(KeyValueList, len(m))
i := 0
for k, v := range m {
kvlist[i] = KeyValue{k, v}
i++
}
sort.Sort(kvlist)
for _, kv := range kvlist {
fmt.Println(kv.Key, kv.Value)
}
- 使用第三方包实现有序的 map,例如 github.com/iancoleman/orderedmap。
import (
"fmt"
"github.com/iancoleman/orderedmap"
)
m := orderedmap.New()
m.Set("a", "apple")
m.Set("b", "banana")
m.Set("c", "cat")
for _, key := range m.Keys() {
fmt.Println(key, m.Get(key.(string)))
}