maps in Go 1.21

2023-10-19 17:12:52 浏览数 (2)

Go 1.21中新增的 maps包中定义了一系列非常有用的函数,用于处理任意类型的 map

Equal

函数签名如下:

代码语言:javascript复制
func Equal[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool

Equal 用于判断两个 map 是否包含相同的键值对,内部使用 == 来对值进行比较。示例如下:

代码语言:javascript复制
package main

import (
    "fmt"
    "maps"
)

func main() {
    m1 := map[string]interface{}{"1": "1", "2": 2}
    m2 := map[string]interface{}{"1": "1", "2": 2}
    m3 := map[string]interface{}{"1": "1", "2": []byte("2")}

    fmt.Println(maps.Equal(m1, m2))     // true
    fmt.Println(maps.Equal(m1, m3))     // false
}

EqualFunc

函数签名如下:

代码语言:javascript复制
func EqualFunc[M1 ~map[K]V1, M2 ~map[K]V2, K comparable, V1, V2 any](m1 M1, m2 M2, eq func(V1, V2) bool) bool

功能与 Equal类似,通过自定义的 eq 来比较值,仍使用 == 来对键进行比较。示例如下:

代码语言:javascript复制
package main

import (
    "fmt"
    "maps"
    "strings"
)

func main() {
    m1 := map[string]string{"1": "1", "2": "2"}
    m2 := map[string][]byte{"1": []byte("1"), "2": []byte("2")}

    result := maps.EqualFunc(m1, m2, func(v1 string, v2 []byte) bool {
        return strings.ToLower(v1) == strings.ToLower(string(v2))
    })
    fmt.Println(result)         // true
}

Clone

函数签名如下:

代码语言:javascript复制
func Clone[M ~map[K]V, K comparable, V any](m M) M

Clone 返回 m 的副本。因为采用的普通的赋值方式,所以是浅拷贝。示例如下:

代码语言:javascript复制
package main

import (
    "fmt"
    "maps"
)

func main() {
    m1 := map[string]string{"1": "1", "2": "2"}
    m2 := maps.Clone(m1)

    fmt.Println(m2)                                         // map[1:1 2:2]
    fmt.Printf("address m1: %pt m2: %pn", &m1, &m2)       // address m1: 0xc000042020     m2: 0xc000042028
}

Copy

函数签名如下:

代码语言:javascript复制
func Copy[M1 ~map[K]V, M2 ~map[K]V, K comparable, V any](dst M1, src M2)

Copy 将源map中所有键值对都复制到目标map中。如果目标map中已存在源map中的键,则使用源map中的值覆盖模板map中对应的值。示例如下:

代码语言:javascript复制
package main

import (
    "fmt"
    "maps"
)

func main() {
    m1 := map[string]string{"1": "1", "2": "2"}
    m2 := map[string]string{"1": "1", "2": "3"}

    maps.Copy(m1, m2)
    fmt.Println(m1)     // map[1:1 2:3]
}

DeleteFunc

函数签名如下:

代码语言:javascript复制
func DeleteFunc[M ~map[K]V, K comparable, V any](m M, del func(K, V) bool)

DeleteFunc 使用自定义的 del 函数删除对应的键值对。示例如下:

代码语言:javascript复制
package main

import (
    "fmt"
    "maps"
)

func main() {
    m1 := map[string]int{"1": 1, "2": 2, "3": 3, "4": 4}

    maps.DeleteFunc(m1, func(key string, val int) bool {
        return val%2 == 0
    })
    fmt.Println(m1)         // map[1:1 3:3]
}

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)[1]进行许可,使用时请注明出处。 Author: mengbin[2] blog: mengbin[3] Github: mengbin92[4] cnblogs: 恋水无意[5]


References

[1] 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0): https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh [2] mengbin: mengbin1992@outlook.com [3] mengbin: https://mengbin.top [4] mengbin92: https://mengbin92.github.io/ [5] 恋水无意: https://www.cnblogs.com/lianshuiwuyi/

0 人点赞