Go 泛型:Maps 包正式釋出,現(xiàn)在可用!
本文轉(zhuǎn)載自微信公眾號(hào)「腦子進(jìn)煎魚(yú)了」,作者 陳煎魚(yú) 。轉(zhuǎn)載本文請(qǐng)聯(lián)系腦子進(jìn)煎魚(yú)了公眾號(hào)。
大家好,我是煎魚(yú)。
給大家?guī)?lái)一個(gè)關(guān)于泛型的新消息,那就是:在幾天前,Go 泛型的配套標(biāo)準(zhǔn)庫(kù) golang.org/x/exp/maps 包已經(jīng)正式提交,放出來(lái)了,可以使用。
如下圖:
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 的鍵值內(nèi)容,鍵值將以不確定的順序出現(xiàn)。
- Values:返回 map 的值,值將以不確定的順序出現(xiàn)。
- Equal:檢查兩個(gè)地圖是否包含相同的鍵/值對(duì),內(nèi)部會(huì)使用 == 來(lái)比較數(shù)值。
- EqualFunc:EqualFunc與 Equal 方法類(lèi)似,但使用閉包方法來(lái)比較數(shù)值,鍵值仍然用 == 來(lái)比較。
- DeleteFunc:刪除 map 中閉包方法返回 true 的任何鍵/值對(duì)。
- 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:返回一個(gè) map 的副本,這是一個(gè)淺層克隆,新拷貝出來(lái)的的鍵和值使用普通的賦值來(lái)設(shè)置。
Copy:復(fù)制 src 中的所有鍵/值對(duì),并將其加入 dst。當(dāng) src 中的一個(gè)鍵已經(jīng)存在于 dst 中時(shí),dst 中的值將被與 src 中的鍵相關(guān)的值所覆蓋。
本次 Go 泛型庫(kù) maps 的更新,主要包含了泛型最新的特性的迭代,也就是 “近似元素”,源碼地址:https://cs.opensource.google/go/x/exp/+/master:maps/maps.go。