Go 泛型:maps 包正式釋出,現在可用!

大家好,我是煎魚。

給大家帶來一個關於泛型的新消息,那就是:在幾天前,Go 泛型的配套標準庫 golang.org/x/exp/maps 包已經正式提交,放出來了,可以使用。

如下圖:

cs.opensource.google

包代碼如下:

package maps

func Keys[M ~map[K]V, K comparable, V any](m M) []{
 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) []{
 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)
  }
 }
}
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 新語法挺醜?最新的泛型類型約束介紹》 中有所介紹,有興趣的小夥伴可以看看。

泛型的時代已經來臨,我的身體已經準備好了。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/owYh5pdsgdZJY02bF0xJXQ