Go1.21新增了maps包,该包提供了map相关的工具函数。

相关issue: https://github.com/golang/go/issues/57436

maps pkg中提供了部分相关的example。

删除

可参考

内部的处理机制是遍历元素,满足条件,则调用delete方法删除。

比较

可参考

    m1 := map[int]string{
        1:    "one",
        10:   "Ten",
        1000: "THOUSAND",
    }
    m2 := map[int][]byte{
        1:    []byte("One"),
        10:   []byte("Ten"),
        1000: []byte("Thousand"),
    }
    eq := maps.EqualFunc(m1, m2, func(v1 string, v2 []byte) bool {
        return strings.EqualFold(v1, string(v2))
    })
    // 比较value使用 传入的函数
    fmt.Println(eq)

    m11 := map[string]int{"one": 1, "two": 2}
    m22 := map[string]int{"one": 1, "two": 2}
    // 比较value使用 !=
    equal := maps.Equal(m11, m22) // true
    fmt.Println(equal)

克隆和拷贝

相关issue

从该issue的benchmark来看的话,maps.Clone性能比普通的map copy操作是更有效率的。

    // copy
    dst := map[string]int{"one": 1, "three": 3}
    src := map[string]int{"two": 2, "three": 33}
    maps.Copy(dst, src)
    fmt.Printf("%#v\n", dst) // map[string]int{"one":1, "three":33, "two":2}

    // clone
    m := map[string]int{"one": 1, "two": 2}
    fmt.Printf("%v %d %p\n", m, len(m), &m) // map[one:1 two:2] 2 0xc000056020
    cloned := maps.Clone(m)
    fmt.Printf("%v %d %p\n", cloned, len(cloned), &cloned) // map[one:1 two:2] 2 0xc000056030