1.map的结构
2.map顺序输出
2.1对key进行排序
func main() {
m := make(map[string]string)
m["b"] = "2"
m["a"] = "1"
m["c"] = "3"
keys := make([]string, 0, len(m))
for k, _ := range m {
keys = append(keys, k)
}
sort.Strings(keys)
//sort.Slice()
for _, k := range keys {
fmt.Printf("Key:%+v, Value:%+v\n", k, m[k])
}
}
//通用方法
func sortedMap(m map[string]interface{}, f func(k string, v interface{})) {
var keys []string
for k := range m {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
f(k, m[k])
}
}
//因为 Go 不支持泛型,所以该方法并不是很通用(当 key 不为 string 的时候),但终究算是一个解决办法。
2.2实现类型linkedhashmap
java采用多态hook实现顺序
第三方 API 返回的 JSON 中就是用 map 来保持顺序的
package main
import (
"fmt"
"github.com/virtuald/go-ordered-json"
)
func main() {
jsonString := `{
"b": "2",
"a": "1",
"c": "3"
}`
oo := json.OrderedObject{}
err := json.Unmarshal([]byte(jsonString), &oo)
if err != nil {
panic(err)
}
fmt.Printf("%+v", oo)
}
//[{Key:b Value:2} {Key:a Value:1} {Key:c Value:3}]
//json.OrderedObject 内部把 map 处理成了 slice,json.OrderedObject 只处理顶层的这个 map,如果嵌套有 map 的话,下层的 map 还是无序的。
2.3encoding/json 库
扮演着 struct 转换器的角色
用它对 map 进行 encode 的时候(就是 json.Marshal )
package main
import (
"encoding/json"
"fmt"
)
func main() {
jsonString := `{
"foo": {
"b": "1",
"a": "2",
"c": "3"
}
}`
o := make(map[string]map[string]string)
err := json.Unmarshal([]byte(jsonString), &o)
if err != nil {
panic(err)
}
fmt.Println("range:")
for _, m := range o {
for k, v := range m {
fmt.Printf("%s, %s\n", k, v)
}
}
bytes, err := json.Marshal(o)
if err != nil {
panic(err)
}
fmt.Println("")
fmt.Println("json:")
fmt.Printf("%s\n", bytes)
}
3.map线程安全
参考
golang实现sortedhashmap和linkedhashmap
有疑问加站长微信联系(非本文作者)