给大家带来一个关于泛型的新消息,那就是:在几天前,Go 泛型的配套标准库 golang.org/x/exp/maps 包已经正式提交,放出来了,可以使用。
如下图:
cs.opensource.google
包代码如下:
package maps
func Keys[M ~map[K]V, K comparable, V any](m M) []K {
r := make([]K, 0, len(m))
for k := range m {
r = append(r, k)
}
return r
}
func Values[M ~map[K]V, K comparable, V any](m M) []V {
r := make([]V, 0, len(m))
for _, v := range m {
r = append(r, v)
}
return r
}
func Equal[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool {
if len(m1) != len(m2) {
return false
}
for k, v1 := range m1 {
if v2, ok := m2[k]; !ok || v1 != v2 {
return false
}
}
return true
}
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 {
if len(m1) != len(m2) {
return false
}
for k, v1 := range m1 {
if v2, ok := m2[k]; !ok || !eq(v1, v2) {
return false
}
}
return true
}
func DeleteFunc[M ~map[K]V, K comparable, V any](m M, del func(K, V) bool) {
for k, v := range m {
if del(k, v) {
delete(m, k)
}
}
}
==
来比较数值。EqualFunc
与 Equal
方法类似,但使用闭包方法来比较数值,键值仍然用 ==
来比较。true
的任何键/值对。
func Clear[M ~map[K]V, K comparable, V any](m M) {
for k := range m {
delete(m, k)
}
}
func Clone[M ~map[K]V, K comparable, V any](m M) M {
r := make(M, len(m))
for k, v := range m {
r[k] = v
}
return r
}
func Copy[M ~map[K]V, K comparable, V any](dst, src M) {
for k, v := range src {
dst[k] = v
}
}
本次 Go 泛型库 maps 的更新,主要包含了泛型最新的特性的迭代,也就是 “近似元素”,源码地址:https://cs.opensource.google/go/x/exp/+/master:maps/maps.go。
这一块的语法介绍我们在《[Go 新语法挺丑?最新的泛型类型约束介绍] 》 中有所介绍,有兴趣的小伙伴可以看看。
泛型的时代已经来临,我的身体已经准备好了。
你呢?欢迎在评论区留言和交流:)
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8