最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入探索Go?1.21中的?maps工具庫

 更新時(shí)間:2023年08月15日 10:54:16   作者:陳明勇  
隨著?Go?1.21.0?版本的發(fā)布,新增了兩個(gè)實(shí)用的泛型工具庫:maps?和?slices,下面小編就帶大家一起學(xué)習(xí)一下?maps?工具庫的相關(guān)知識(shí)吧

前言

隨著 Go 1.21.0 版本的發(fā)布,新增了兩個(gè)實(shí)用的泛型工具庫:mapsslices,它們分別提供了處理映射(map)和切片常見操作的函數(shù),減少了我們重復(fù)造輪子的過程,提高開發(fā)效率。本文將會(huì)對(duì) maps 工具庫進(jìn)行介紹。

準(zhǔn)備好了嗎?準(zhǔn)備一杯你最喜歡的咖啡或茶,隨著本文一探究竟吧。

Maps

maps 是一個(gè)泛型工具庫,該庫包含了對(duì)任何類型都支持的實(shí)用函數(shù),函數(shù)簡(jiǎn)介如下表所示:

函數(shù)函數(shù)簽名功能
Clonefunc Clone[M ~map[K]V, K comparable, V any](m M) M該函數(shù)返回 m 的一個(gè)副本,底層基于淺層克隆去實(shí)現(xiàn),使用普通賦值的方式去設(shè)置新的鍵值對(duì)
Copyfunc Copy[M1 ~map[K]V, M2 ~map[K]V, K comparable, V any](dst M1, src M2)復(fù)制 src 中的所有鍵值對(duì)到 dst 中,如果 dst 中包含 src 中的任意 key,則該 key 對(duì)應(yīng)的 value 將會(huì)被覆蓋
DeleteFuncfunc DeleteFunc[M ~map[K]V, K comparable, V any](m M, del func(K, V) bool)刪除 m 中滿足 del 返回為 true 的任何鍵值對(duì)
Equalfunc Equal[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool判斷兩個(gè) map 是否包含相同的鍵值對(duì),內(nèi)部使用 == 進(jìn)行比較
EqualFuncfunc EqualFunc[M1 ~map[K]V1, M2 ~map[K]V2, K comparable, V1, V2 any](m1 M1, m2 M2, eq func(V1, V2) bool) bool類似 Equal 函數(shù),但通過 eq 函數(shù)進(jìn)行比較值,鍵仍使用 == 進(jìn)行比較

Clone

Clone 函數(shù)接收一個(gè) m 參數(shù),該函數(shù)的功能是返回 m 的副本,底層基于淺層克隆去實(shí)現(xiàn),使用普通賦值的方式去設(shè)置新的鍵值對(duì)。

代碼示例:

package main
import (
	"fmt"
	"maps"
)
func main() {
	type Programmer struct {
		Name string
		City string
	}
	m1 := map[string]Programmer{
		"programmer-01": {Name: "陳明勇", City: "深圳"},
		"programmer-02": {Name: "張三", City: "廣州"},
	}
	m2 := maps.Clone(m1)
	fmt.Printf("m1: %v\n", m1)
	fmt.Printf("m2: %v\n", m2)
}

執(zhí)行結(jié)果:

m1: map[programmer-01:{陳明勇 深圳} programmer-02:{張三 廣州}]
m2: map[programmer-01:{陳明勇 深圳} programmer-02:{張三 廣州}]

上述例子中,首先創(chuàng)建一個(gè) map 類型的變量 m1,然后通過 maps.Clone() 函數(shù)進(jìn)行克隆,得到 m2,最后通過打印結(jié)果可知 m2 的值和 m1 的值一樣。

從函數(shù)的功能描述中可知,Clone 函數(shù)的原理是淺層克隆,那么修改克隆后的 map 任意 keyvalue 將有可能影響原 mapvalue。

我們來看下下面的例子:

package main
import (
	"fmt"
	"maps"
)
func main() {
	type Programmer struct {
		Name string
		City string
	}
	m1 := map[string]*Programmer{
		"programmer-01": {Name: "陳明勇", City: "深圳"},
		"programmer-02": {Name: "張三", City: "廣州"},
	}
	fmt.Printf("m1: %v, %v\n", *m1["programmer-01"], *m1["programmer-02"])
	m2 := maps.Clone(m1)
	fmt.Printf("m2: %v, %v\n", *m2["programmer-01"], *m2["programmer-02"])
	m2["programmer-02"].City = "???
	fmt.Printf("m2 被修改后,m1: %v, %v\n", *m1["programmer-01"], *m1["programmer-02"])
	fmt.Printf("m2 被修改后,m2: %v, %v\n", *m2["programmer-01"], *m2["programmer-02"])
}

執(zhí)行結(jié)果

m1: {陳明勇 深圳}, {張三 廣州}
m2: {陳明勇 深圳}, {張三 廣州}
m2 被修改后,m1: {陳明勇 深圳}, {張三 海口}
m2 被修改后,m2: {陳明勇 深圳}, {張三 ??趠

與前面的示例不同,這個(gè)例子中的一個(gè)關(guān)鍵區(qū)別在于 value 是指針類型。從執(zhí)行結(jié)果可以明顯看出,如果 m1value 是指針類型,那么在對(duì)克隆后的 m2 中的任意 key 對(duì)應(yīng)的 value 進(jìn)行修改操作后,都會(huì)直接影響到 m1。這是因?yàn)?m1m2 共享了同一組指向相同 Programmer 結(jié)構(gòu)體的指針,因此對(duì)一個(gè)指針的修改會(huì)在兩個(gè) map 中都可見。

Copy

Copy 函數(shù)接收兩個(gè) map 參數(shù) dstsrc,該函數(shù)的功能是復(fù)制 src 中的所有鍵值對(duì)到 dst 中,如果 dst 中包含 src 中的任意 key,則該 key 對(duì)應(yīng)的 value 將會(huì)被覆蓋。

代碼示例:

package main
import (
	"fmt"
	"maps"
)
func main() {
	m1 := map[string]string{"Name": "陳明勇", "City": "深圳"}
	m2 := map[string]string{"City": "廣州", "Phone": "123456789"}
	maps.Copy(m1, m2)
	fmt.Println(m1)
}

執(zhí)行結(jié)果:

map[City:廣州 Name:陳明勇 Phone:123456789]

在上述例子中,首先創(chuàng)建了兩個(gè) map 變量,分別為 m1m2,然后通過 maps.Copy 函數(shù),將 m2 中的鍵值對(duì)復(fù)制到 m1 中,最后打印復(fù)制后的結(jié)果。

根據(jù)結(jié)果可知,由于 m1m2 都包含 key → City,因此在執(zhí)行復(fù)制操作后, m1 中的 key → City 對(duì)應(yīng)的 value 值會(huì)被覆蓋。

DeleteFunc

DeleteFunc 函數(shù)接收一個(gè) map 類型的參數(shù) m 和一個(gè)函數(shù)類型的參數(shù) del。該函數(shù)的功能是刪除 m 中滿足 del 返回為 true 的任何鍵值對(duì)。

代碼示例:

package main
import (
	"fmt"
	"maps"
)
func main() {
	m1 := map[int]string{1: "陳明勇", 2: "張三", 3: "李四", 4: "王五"}
	maps.DeleteFunc(m1, func(k int, v string) bool {
		return k%2 == 0
	})
	fmt.Println(m1)
}

執(zhí)行結(jié)果:

map[1:陳明勇 3:李四]

在上述例子中,首先創(chuàng)建了一個(gè) map 變量 m1,使用 int 類型作為學(xué)號(hào)(key),string 類型作為姓名(value),然后通過 maps.DeleteFunc 刪除學(xué)號(hào)為雙數(shù)的學(xué)生,匿名函數(shù)的邏輯是 當(dāng)學(xué)號(hào)為雙數(shù)時(shí),返回 true。

總體來說這個(gè)例子相對(duì)簡(jiǎn)單,讀者可根據(jù)實(shí)際應(yīng)用場(chǎng)景進(jìn)行使用 DeleteFunc 函數(shù)。

Equal

Equal 函數(shù)接收兩個(gè) map 變量,函數(shù)的返回值為 bool 類型。該函數(shù)的功能是判斷兩個(gè) map 是否包含相同的鍵值對(duì),內(nèi)部使用 == 進(jìn)行比較。注意:map 類型的 keyvalue 必須是 comparable 類型。

代碼示例:

package main
import (
	"fmt"
	"maps"
)
func main() {
	m1 := map[int]int{0: 0, 1: 1, 2: 2}
	m2 := map[int]int{0: 0, 1: 1}
	m3 := map[int]int{0: 0, 1: 1, 2: 2}
	fmt.Println(maps.Equal(m1, m2)) // false
	fmt.Println(maps.Equal(m1, m3)) // true
}

執(zhí)行結(jié)果:

false
true

上述例子中,首先創(chuàng)建了三個(gè) map 類型變量,分別是 m1、m2m3,然后通過 maps.Equal() 函數(shù),對(duì) m1m2 以及 m1m3 進(jìn)行等價(jià)比較。執(zhí)行結(jié)果與預(yù)期一致,m1m3 是相等的,m1m2 不相等。

EqualFunc

EqualFunc 函數(shù)類似 Equal 函數(shù),只不過是通過 eq 函數(shù)進(jìn)行比較值,鍵仍使用 == 進(jìn)行比較。注意: value 可以為任意類型(any)。

代碼示例:

package main
import (
	"fmt"
	"maps"
)
func main() {
	type User struct {
		Nickname string
		IdCard   string
	}
	m1 := map[int]User{0: {Nickname: "陳明勇", IdCard: "111"}, 1: {Nickname: "張三", IdCard: "222"}}
	m2 := map[int]User{0: {Nickname: "陳明勇", IdCard: "111"}}
	m3 := map[int]User{0: {Nickname: "Go技術(shù)干貨", IdCard: "111"}, 1: {Nickname: "張三", IdCard: "222"}}
	fmt.Println(maps.EqualFunc(m1, m2, func(user User, user2 User) bool {
		return user.IdCard == user2.IdCard
	})) // false
	fmt.Println(maps.EqualFunc(m1, m3, func(user User, user2 User) bool {
		return user.IdCard == user2.IdCard
	})) // true
}

執(zhí)行結(jié)果:

false
true

上述例子中,首先創(chuàng)建了三個(gè) map 類型變量,分別是 m1、m2m3。這些 map 使用 int 類型作為編號(hào)(key),User 類型作為用戶信息(value)。

接著,使用 maps.EqualFunc() 函數(shù),對(duì) m1m2 以及 m1m3 進(jìn)行等價(jià)比較,在這個(gè)函數(shù)中,我們自定義了比較函數(shù) eq,其邏輯是只要兩個(gè) User 結(jié)構(gòu)體的 IdCard 相同,就認(rèn)為它們是同一個(gè)人(相等)。執(zhí)行結(jié)果與預(yù)期一致,m1m3 是相等的,m1m2 不相等。

小結(jié)

本文對(duì) Go 工具庫 maps 進(jìn)行詳細(xì)介紹,包括其提供的函數(shù) Clone、CopyDeleteFunc、EqualEqualFunc,并強(qiáng)調(diào)了使用這些函數(shù)時(shí)需要注意的地方。

總的來說,通過使用這些函數(shù),減少了我們重復(fù)造輪子的過程,提高開發(fā)效率。

你使用 maps 工具庫了嗎?

推薦閱讀

Go 1.21新內(nèi)置函數(shù)min、max和clear的用法詳解

到此這篇關(guān)于深入探索Go 1.21中的 maps工具庫的文章就介紹到這了,更多相關(guān)Go 1.21 maps內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文詳解Python如何處理無法解碼文件名

    一文詳解Python如何處理無法解碼文件名

    在跨平臺(tái)文件處理,國(guó)際化應(yīng)用或系統(tǒng)管理工具開發(fā)中,文件名無法正確解碼是文件名無法正確解碼,本文將深入探討Python中處理無法解碼文件名的方法,大家可以根據(jù)需要進(jìn)行選擇
    2025-09-09
  • 使用Go語言編寫簡(jiǎn)潔代碼的最佳實(shí)踐

    使用Go語言編寫簡(jiǎn)潔代碼的最佳實(shí)踐

    簡(jiǎn)潔的代碼對(duì)于創(chuàng)建可維護(hù)、可閱讀和高效的軟件至關(guān)重要,Go 是一種強(qiáng)調(diào)簡(jiǎn)單和代碼整潔的語言,在本文中,我們將結(jié)合代碼示例,探討編寫簡(jiǎn)潔 Go 代碼的最佳實(shí)踐,需要的朋友可以參考下
    2023-09-09
  • 最新評(píng)論

    邵东县| 潼南县| 宁海县| 和田县| 塔河县| 京山县| 六安市| 于田县| 县级市| 海伦市| 讷河市| 萝北县| 堆龙德庆县| 来凤县| 珲春市| 太原市| 南溪县| 通榆县| 陇西县| 琼结县| 沁阳市| 荃湾区| 紫金县| 图们市| 武隆县| 衡水市| 汕尾市| 明溪县| 晋城| 凭祥市| 阿拉善左旗| 银川市| 浠水县| 旬阳县| 沂南县| 泰和县| 酉阳| 敦化市| 河源市| 合作市| 永康市|