美文网首页
golang中的map

golang中的map

作者: 无拘无束的猪 | 来源:发表于2020-08-28 01:02 被阅读0次

    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线程安全

    4.底层实现

    参考

    golang实现sortedhashmap和linkedhashmap
    底层实现
    底层实现2

    相关文章

      网友评论

          本文标题:golang中的map

          本文链接:https://www.haomeiwen.com/subject/hrrksktx.html