婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang 空map和未初始化map的注意事項(xiàng)說明

Golang 空map和未初始化map的注意事項(xiàng)說明

熱門標(biāo)簽:百度地圖標(biāo)注后傳給手機(jī) 壽光微信地圖標(biāo)注 阿克蘇地圖標(biāo)注 涿州代理外呼系統(tǒng) 評價(jià)高的400電話辦理 電話機(jī)器人軟件免費(fèi) 外呼系統(tǒng)顯本地手機(jī)號 excel地圖標(biāo)注分布數(shù)據(jù) 外呼系統(tǒng)用什么卡

可以對未初始化的map進(jìn)行取值,但取出來的東西是空:

var m1 map[string]string
fmt.Println(m1["1"])

不能對未初始化的map進(jìn)行賦值,這樣將會拋出一個異常:

panic: assignment to entry in nil map

var m1 map[string]string
m1["1"] = "1"

通過fmt打印map時(shí),空map和nil map結(jié)果是一樣的,都為map[]。所以,這個時(shí)候別斷定map是空還是nil,而應(yīng)該通過map == nil來判斷。

補(bǔ)充:Golang清空map的兩種方式及性能比拼

一、Golang中刪除map的方法

1、所有Go版本通用方法

a := make(map[string]int)
a["a"] = 1
a["b"] = 2
// clear all
a = make(map[string]int)

2. Go 1.11版本以上用法

通過Go的內(nèi)部函數(shù)mapclear方法刪除。這個函數(shù)并沒有顯示的調(diào)用方法,當(dāng)你使用for循環(huán)遍歷刪除所有元素時(shí),Go的編譯器會優(yōu)化成Go內(nèi)部函數(shù)mapclear。

package main
func main() {
        m := make(map[byte]int)
        m[1] = 1
        m[2] = 2
        for k := range m {
	        delete(m, k)
        }
}

把上述源代碼直接編譯成匯編(默認(rèn)編譯是會優(yōu)化的):

go tool compile -S map_clear.go

可以看到編譯器把源碼9行的for循環(huán)直接優(yōu)化成了mapclear去刪除所有元素。如下:

再來看看關(guān)閉優(yōu)化后的結(jié)果:

go tool compile -l -N -S map_clear.go

關(guān)閉優(yōu)化選項(xiàng)后,Go編譯器直接通過循環(huán)遍歷來刪除map里面的元素。

具體的mapclear代碼可以在go源碼庫中runtime/map.go文件中看到,代碼如下:

// mapclear deletes all keys from a map.
func mapclear(t *maptype, h *hmap) {
	if raceenabled  h != nil {
		callerpc := getcallerpc()
		pc := funcPC(mapclear)
		racewritepc(unsafe.Pointer(h), callerpc, pc)
	}
	if h == nil || h.count == 0 {
		return
	}
	if h.flagshashWriting != 0 {
		throw("concurrent map writes")
	}
	h.flags ^= hashWriting
	h.flags ^= sameSizeGrow
	h.oldbuckets = nil
	h.nevacuate = 0
	h.noverflow = 0
	h.count = 0
	// Keep the mapextra allocation but clear any extra information.
	if h.extra != nil {
		*h.extra = mapextra{}
	}
	// makeBucketArray clears the memory pointed to by h.buckets
	// and recovers any overflow buckets by generating them
	// as if h.buckets was newly alloced.
	_, nextOverflow := makeBucketArray(t, h.B, h.buckets)
	if nextOverflow != nil {
		// If overflow buckets are created then h.extra
		// will have been allocated during initial bucket creation.
		h.extra.nextOverflow = nextOverflow
	}
	if h.flagshashWriting == 0 {
		throw("concurrent map writes")
	}
	h.flags ^= hashWriting
}

二、兩種清空map方式性能比較

1、先用benchmark的方式測一下兩種方式

benchmark代碼如下:

func BenchmarkMakeNewMap(b *testing.B) {
	tmpMap := make(map[string]string, 10000)
	for i := 0; i  b.N; i++ {
		for j := 0; j  10000; j++ {
			tmpMap["tmp"+strconv.Itoa(j)] = "tmp"
		}
		tmpMap = make(map[string]string, 10000)
	}
}
func BenchmarkDeleteMap(b *testing.B) {
	tmpMap := make(map[string]string, 10000)
	for i := 0; i  b.N; i++ {
		for j := 0; j  10000; j++ {
			tmpMap["tmp"+strconv.Itoa(j)] = "tmp"
		}
		for k := range tmpMap {
			delete(tmpMap, k)
		}
	}
}

得到測試結(jié)果如下:

從測試結(jié)果上看,好像確實(shí)delete的方式效率更高,但是這個benchmark中總感覺沒有測試到真正清空map的地方,中間穿插著put map的操作,我們用方法2再測一下。

2、單個UT測一下兩種方式

UT代碼如下:

測試過程中禁用了gc,避免gc對運(yùn)行時(shí)間和內(nèi)存產(chǎn)生干擾。

func TestMakeNewMap(t *testing.T) {
   debug.SetGCPercent(-1)
   var m runtime.MemStats
   tmpMap := make(map[string]string, 1000000)
   for j := 0; j  1000000; j++ {
      tmpMap["tmp"+strconv.Itoa(j)] = "tmp"
   }
   start := time.Now()
   tmpMap = make(map[string]string, 1000000)
   fmt.Println(time.Since(start).Microseconds())
   runtime.ReadMemStats(m)
   fmt.Printf("%d Kb\n", m.Alloc/1024)
}
func TestDeleteMap(t *testing.T) {
   debug.SetGCPercent(-1)
   var m runtime.MemStats
   tmpMap2 := make(map[string]string, 1000000)
   for j := 0; j  1000000; j++ {
      tmpMap2["tmp"+strconv.Itoa(j)] = "tmp"
   }
   start := time.Now()
   for k := range tmpMap2 {
      delete(tmpMap2, k)
   }
   fmt.Println(time.Since(start).Microseconds())
   runtime.ReadMemStats(m)
   fmt.Printf("%d Kb\n", m.Alloc/1024)
}

測試結(jié)果如下:

從測試結(jié)果上看,好像確實(shí)是make方式的效率更低,而且內(nèi)存占用更多,但結(jié)果真的是這樣嗎?

我們把make方式的make map的大小改為0再試一下:

tmpMap = make(map[string]string)

得到如下結(jié)果,What?時(shí)間為0了,內(nèi)存消耗也跟delete的方式一樣:

我們把make方式的make map的大小改為10000再試一下:

tmpMap = make(map[string]string, 10000)

結(jié)果如下:

三、總結(jié)

通過上面的測試,可以得出結(jié)論:

1、在map的數(shù)量級在10w以內(nèi)的話,make方式會比delete方式速度更快,但是內(nèi)存會消耗更多一點(diǎn)。

2、如果map數(shù)量級大于10w的話,delete的速度會更快,且內(nèi)存消耗更少。

3、對于不再使用的map,直接使用make方式,長度為0清空更快。

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • golang 實(shí)現(xiàn)對Map進(jìn)行鍵值自定義排序
  • golang 如何獲取map所有key的方式
  • golang判斷key是否在map中的代碼
  • 解決Golang map range遍歷結(jié)果不穩(wěn)定問題
  • 快速解決Golang Map 并發(fā)讀寫安全的問題
  • golang 實(shí)現(xiàn)struct、json、map互相轉(zhuǎn)化
  • Golang自定義結(jié)構(gòu)體轉(zhuǎn)map的操作
  • Golang 使用Map實(shí)現(xiàn)去重與set的功能操作

標(biāo)簽:雞西 欽州 汕頭 梅河口 重慶 銅川 吐魯番 蘭州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang 空map和未初始化map的注意事項(xiàng)說明》,本文關(guān)鍵詞  Golang,空,map,和,未,初始化,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang 空map和未初始化map的注意事項(xiàng)說明》相關(guān)的同類信息!
  • 本頁收集關(guān)于Golang 空map和未初始化map的注意事項(xiàng)說明的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    2023国产精华国产精品| 久久精品一区蜜桃臀影院| 国产不卡免费视频| 九一九一国产精品| 五月天视频一区| 天天影视涩香欲综合网| 一区二区三区日本| 亚洲小说春色综合另类电影| 亚洲午夜视频在线观看| 一区二区在线电影| 亚洲成人激情综合网| 亚洲成人动漫一区| 午夜久久福利影院| 免费国产亚洲视频| 国内精品国产成人| 成人中文字幕电影| 成人动漫一区二区在线| 色就色 综合激情| 欧美日韩视频在线一区二区| 精品女同一区二区| 久久精品一区四区| 亚洲人一二三区| 亚洲国产日韩a在线播放| 天天免费综合色| 国产在线麻豆精品观看| 粉嫩在线一区二区三区视频| 不卡视频一二三| 91精品国产色综合久久| 久久麻豆一区二区| 亚洲理论在线观看| 麻豆久久久久久| 成人av在线影院| 欧美久久高跟鞋激| 精品国产乱码久久久久久久久 | 国产成a人无v码亚洲福利| 91麻豆视频网站| 欧美videos大乳护士334| 日韩理论电影院| 另类小说综合欧美亚洲| 丰满岳乱妇一区二区三区| 91精品久久久久久久99蜜桃| 久久久综合精品| 亚洲国产视频直播| 波多野结衣在线一区| 日韩亚洲欧美一区二区三区| 日韩一区中文字幕| 国产精品白丝jk黑袜喷水| 欧美三片在线视频观看| 国产精品色呦呦| 国内精品免费**视频| 欧美色图在线观看| 亚洲男人电影天堂| 国产成人日日夜夜| 久久伊人蜜桃av一区二区| 天堂一区二区在线免费观看| 色综合久久久久网| 国产精品久久久久久久久免费桃花| 精品一区二区三区在线观看国产| 欧美性猛交xxxx乱大交退制版 | 国产99久久久精品| 国产一区二区三区日韩| 欧美一级片在线看| 欧美三级日韩三级国产三级| 欧美大片拔萝卜| 久久久精品2019中文字幕之3| 欧美一区二区三区播放老司机| 精品国产一区二区三区av性色| 欧美精品一区二区三区视频| 亚洲精品免费电影| 久久精品99国产精品日本| 成人国产视频在线观看| 欧美日韩色综合| 精品国产第一区二区三区观看体验| 成人免费一区二区三区视频 | 日韩精品综合一本久道在线视频| 久久精品亚洲乱码伦伦中文| 亚洲成人精品一区| 不卡视频一二三四| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲一区av在线| 色激情天天射综合网| 久久久精品综合| 免费成人性网站| 欧美日韩国产bt| 国产免费久久精品| 国产一区二区三区久久久| 在线播放一区二区三区| 亚洲综合一区二区三区| 97se亚洲国产综合自在线| 欧美色男人天堂| 久久精品999| 日韩精品一区二区三区中文不卡 | 亚洲国产精华液网站w| 久久国产尿小便嘘嘘尿| 7777精品伊人久久久大香线蕉超级流畅| 中文字幕一区二区三区精华液| 国产成人在线色| 久久精品人人做| 丁香亚洲综合激情啪啪综合| 国产视频视频一区| 国产一区二区主播在线| 日韩精品一区二区在线观看| 狠狠久久亚洲欧美| 精品久久久久av影院| 另类小说色综合网站| 欧美成人一区二区三区| 中文字幕一区二区三区不卡| 欧美日韩精品系列| 美女www一区二区| 精品福利视频一区二区三区| 国产一区三区三区| 国产精品无遮挡| 91看片淫黄大片一级在线观看| 亚洲三级免费电影| 91在线免费视频观看| 亚洲乱码国产乱码精品精的特点| 在线观看精品一区| 日韩在线卡一卡二| 精品国产免费久久| 成人18视频在线播放| 亚洲黄色片在线观看| 欧美日韩1234| 精品一区二区在线观看| 精品国产乱码久久久久久久 | 久久精品欧美一区二区三区麻豆| 风间由美中文字幕在线看视频国产欧美| 久久精品一区二区三区四区| 99国产精品久久久| 秋霞电影网一区二区| 国产精品网站一区| 99精品在线免费| 日本亚洲免费观看| 中文字幕欧美日本乱码一线二线| 欧美网站大全在线观看| 国产在线不卡一区| 亚洲色大成网站www久久九九| 欧美日韩电影在线| 不卡在线观看av| 蜜桃久久久久久| 亚洲欧洲精品天堂一级| 91精品国产高清一区二区三区 | 日韩亚洲欧美在线观看| 成人国产精品免费网站| 日本亚洲三级在线| 亚洲人成人一区二区在线观看| 日韩一级片网址| 欧美在线播放高清精品| 国产成人h网站| 免费日韩伦理电影| 国产欧美日韩三区| 日韩欧美一区二区不卡| 日本伦理一区二区| av在线一区二区| 九九热在线视频观看这里只有精品| 亚洲一区在线播放| 中文字幕日本不卡| 久久一夜天堂av一区二区三区| 欧美精品乱码久久久久久按摩| 成人av电影免费在线播放| 国产精品影视天天线| 美女一区二区三区在线观看| 五月综合激情婷婷六月色窝| 亚洲一区二区在线免费看| 国产精品久久久久影院色老大| 国产片一区二区| 91精品国产麻豆国产自产在线 | 午夜av电影一区| 一区二区三区国产精华| 中文字幕一区二区三区不卡| 国产精品色一区二区三区| 国产午夜精品美女毛片视频| 欧美成人精品3d动漫h| 日韩一区二区在线观看| 在线观看日韩毛片| 在线观看日韩精品| 欧美三级电影在线看| 欧美日韩国产成人在线91| 欧美日韩1234| 欧美一区二区女人| 精品国产成人在线影院| 91精品国产高清一区二区三区蜜臀 | 国产在线精品一区二区三区不卡| 美腿丝袜亚洲综合| 九色综合狠狠综合久久| 国产精品主播直播| 蜜桃久久精品一区二区| av亚洲精华国产精华精华| 91蜜桃在线观看| 欧美午夜视频网站| 91麻豆精品国产自产在线观看一区 | 欧美一区二区三区思思人| 91精品国产综合久久精品图片| 久久众筹精品私拍模特| 久久嫩草精品久久久久| 亚洲一区二区三区激情| 日本女优在线视频一区二区| 国产一区二区成人久久免费影院| 99久久国产综合精品麻豆| 欧美视频精品在线观看| 久久亚洲春色中文字幕久久久|