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

Equal

函数签名如下:

func Equal[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool

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

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

函数签名如下:

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 来比较值,仍使用 == 来对键进行比较。示例如下:

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

函数签名如下:

func Clone[M ~map[K]V, K comparable, V any](m M) M

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

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: %p\t m2: %p\n", &m1, &m2)       // address m1: 0xc000042020	 m2: 0xc000042028
}

Copy

函数签名如下:

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中对应的值。示例如下:

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

函数签名如下:

func DeleteFunc[M ~map[K]V, K comparable, V any](m M, del func(K, V) bool)

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

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)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意