Go 泛型:maps 包正式释出,现在可用!

大家好,我是煎鱼。

给大家带来一个关于泛型的新消息,那就是:在几天前,Go 泛型的配套标准库 golang.org/x/exp/maps 包已经正式提交,放出来了,可以使用。

3eaed9a04bdb6695b280a75cd64365ec.png

如下图:

75b6ca474cf0745bc8c15a22e84b436e.png
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)
  }
 }
}
  • Keys:返回 map 的键值内容,键值将以不确定的顺序出现。

  • Values:返回 map 的值,值将以不确定的顺序出现。

  • Equal:检查两个地图是否包含相同的键/值对,内部会使用 == 来比较数值。

  • EqualFunc:EqualFuncEqual 方法类似,但使用闭包方法来比较数值,键值仍然用 == 来比较。

  • DeleteFunc:删除 map 中闭包方法返回 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
 }
}
  • Clear:清除从 map 中删除所有条目,使之为空。

  • Clone:返回一个 map 的副本,这是一个浅层克隆,新拷贝出来的的键和值使用普通的赋值来设置。

  • Copy:复制 src 中的所有键/值对,并将其加入 dst。当 src 中的一个键已经存在于 dst 中时,dst 中的值将被与 src 中的键相关的值所覆盖。

本次 Go 泛型库 maps 的更新,主要包含了泛型最新的特性的迭代,也就是 “近似元素”,源码地址:https://cs.opensource.google/go/x/exp/+/master:maps/maps.go。

这一块的语法介绍我们在《Go 新语法挺丑?最新的泛型类型约束介绍》 中有所介绍,有兴趣的小伙伴可以看看。

泛型的时代已经来临,我的身体已经准备好了。

你呢?欢迎在评论区留言和交流:)

关注煎鱼,吸取他的知识 👇

d5d700d3258fb92eaaed63dbf70fc4ec.png

3383cd6bc157f9fff875d6fe965a6257.png

你好,我是煎鱼,出版过 Go 畅销书《Go 语言编程之旅》,再到获得 GOP(Go 领域最有观点专家)荣誉,点击蓝字查看我的出书之路

日常分享高质量文章,输出 Go 面试、工作经验、架构设计,加微信拉读者交流群,和大家交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值