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) []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:EqualFunc與 Equal 方法類似,但使用閉包方法來比較數值,鍵值仍然用 == 來比較。
- 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。