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: 恋水无意