校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

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

Golang 空map和未初始化map的注意事項說明

熱門標簽:百度地圖標注后傳給手機 壽光微信地圖標注 阿克蘇地圖標注 涿州代理外呼系統 評價高的400電話辦理 電話機器人軟件免費 外呼系統顯本地手機號 excel地圖標注分布數據 外呼系統用什么卡

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

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

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

panic: assignment to entry in nil map

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

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

補充: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的內部函數mapclear方法刪除。這個函數并沒有顯示的調用方法,當你使用for循環遍歷刪除所有元素時,Go的編譯器會優化成Go內部函數mapclear。

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

把上述源代碼直接編譯成匯編(默認編譯是會優化的):

go tool compile -S map_clear.go

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

再來看看關閉優化后的結果:

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

關閉優化選項后,Go編譯器直接通過循環遍歷來刪除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)
		}
	}
}

得到測試結果如下:

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

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

UT代碼如下:

測試過程中禁用了gc,避免gc對運行時間和內存產生干擾。

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)
}

測試結果如下:

從測試結果上看,好像確實是make方式的效率更低,而且內存占用更多,但結果真的是這樣嗎?

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

tmpMap = make(map[string]string)

得到如下結果,What?時間為0了,內存消耗也跟delete的方式一樣:

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

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

結果如下:

三、總結

通過上面的測試,可以得出結論:

1、在map的數量級在10w以內的話,make方式會比delete方式速度更快,但是內存會消耗更多一點。

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

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

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

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

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

巨人網絡通訊聲明:本文標題《Golang 空map和未初始化map的注意事項說明》,本文關鍵詞  Golang,空,map,和,未,初始化,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang 空map和未初始化map的注意事項說明》相關的同類信息!
  • 本頁收集關于Golang 空map和未初始化map的注意事項說明的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    成人亚洲精品久久久久软件| 九九**精品视频免费播放| 欧美不卡一区二区三区| 在线观看日韩电影| 欧美亚洲国产一区二区三区 | 精品中文av资源站在线观看| 亚洲国产cao| 午夜欧美大尺度福利影院在线看| 亚洲第四色夜色| 亚洲成av人片一区二区三区| 婷婷久久综合九色国产成人| 日本欧美一区二区三区乱码| 美女精品一区二区| 国产在线麻豆精品观看| 国产a久久麻豆| av中文字幕在线不卡| 色悠悠久久综合| 在线电影院国产精品| 欧美一级午夜免费电影| 久久男人中文字幕资源站| 国产精品久久久久久福利一牛影视 | 久久精品99国产精品| 久久精品国产77777蜜臀| 国产成人在线电影| 日本精品裸体写真集在线观看| 欧美精品一区二区三区高清aⅴ | 国产在线一区观看| av成人动漫在线观看| 欧美偷拍一区二区| 国产亚洲欧美日韩日本| 亚洲精品欧美在线| 精品一区二区三区欧美| 91黄色激情网站| 久久久不卡网国产精品一区| 亚洲一区在线观看免费观看电影高清 | 色婷婷精品大视频在线蜜桃视频| 欧美日韩国产免费一区二区 | 91久久精品国产91性色tv| 日韩区在线观看| 亚洲精品中文在线影院| 国产一区二区视频在线播放| 欧美制服丝袜第一页| 国产午夜精品理论片a级大结局 | 亚洲国产成人一区二区三区| 亚洲一区欧美一区| 成人中文字幕电影| 欧美zozo另类异族| 性做久久久久久免费观看| 成人avav影音| 久久久综合九色合综国产精品| 亚洲午夜激情av| 色国产综合视频| 国产精品每日更新| 国产在线精品一区二区三区不卡| 欧美视频一区二区| 亚洲欧美日韩国产综合在线| 国产精品一卡二| 欧美成人精品二区三区99精品| 亚洲国产综合在线| 日本丶国产丶欧美色综合| 成人欧美一区二区三区黑人麻豆| 国内一区二区在线| 日韩精品一区二区三区蜜臀| 丝袜脚交一区二区| 7777精品伊人久久久大香线蕉的 | 欧美午夜精品一区二区三区| 国产精品免费免费| 成人免费视频一区二区| 国产日产欧产精品推荐色| 国产麻豆精品在线观看| 久久久久亚洲蜜桃| 成人中文字幕电影| 国产精品不卡在线| 国产超碰在线一区| 亚洲国产精华液网站w| 国产黄人亚洲片| 国产精品美女久久久久高潮| 不卡的电影网站| 亚洲精品精品亚洲| 欧美日韩国产bt| 日韩高清在线一区| 欧美成人欧美edvon| 国产一区二区三区精品视频| 国产视频一区在线观看| av在线不卡免费看| 亚洲另类春色校园小说| 欧美色综合网站| 日韩精品一二区| 欧美成人午夜电影| 99久久夜色精品国产网站| 一区二区三区在线视频免费观看| 在线看国产一区| 久久成人久久鬼色| 国产精品欧美综合在线| 欧美综合欧美视频| 久久99国产精品免费网站| 国产拍欧美日韩视频二区| 99国产欧美久久久精品| 亚洲18色成人| 国产欧美日韩不卡免费| 91麻豆成人久久精品二区三区| 亚洲在线观看免费视频| 欧美老肥妇做.爰bbww视频| 精品一区二区三区香蕉蜜桃| **欧美大码日韩| 91高清在线观看| 九一九一国产精品| 亚洲黄网站在线观看| 精品久久久影院| 日本道精品一区二区三区| 精品在线播放午夜| 一区二区欧美国产| 久久久三级国产网站| 精品视频一区三区九区| 国产不卡视频一区二区三区| 午夜精品久久久久久| 亚洲国产精品成人综合 | 亚洲三级小视频| 精品国产乱码久久久久久闺蜜| 91视频国产资源| 国产呦萝稀缺另类资源| 日本欧美大码aⅴ在线播放| 亚洲免费观看在线视频| 久久午夜羞羞影院免费观看| 一本大道久久a久久精品综合| 国产在线看一区| 免费欧美在线视频| 亚洲高清免费视频| 亚洲免费三区一区二区| 蜜桃视频在线观看一区| 色综合久久中文字幕| 国产精品一二三四区| 免费视频一区二区| 亚洲午夜激情网站| 亚洲欧美日本在线| 国产日韩精品久久久| 精品久久久久av影院| 91精品国产免费久久综合| 在线亚洲精品福利网址导航| 成人av影视在线观看| 国产盗摄女厕一区二区三区| 九色综合国产一区二区三区| 欧美96一区二区免费视频| 日本网站在线观看一区二区三区| 亚洲成人黄色小说| 亚洲一区二三区| 亚洲午夜国产一区99re久久| 亚洲精品乱码久久久久| 亚洲自拍另类综合| 亚洲影院理伦片| 午夜精品一区二区三区三上悠亚| 一级日本不卡的影视| 亚洲一线二线三线久久久| 亚洲午夜久久久久| 午夜欧美视频在线观看| 全国精品久久少妇| 男人操女人的视频在线观看欧美| 日韩国产精品久久| 美国av一区二区| 国产一区中文字幕| 成人av网站在线观看| 欧洲精品一区二区三区在线观看| 在线视频你懂得一区| 欧美日本韩国一区| 日韩精品在线看片z| 久久久久久亚洲综合影院红桃| 国产目拍亚洲精品99久久精品| 中文字幕第一区综合| 亚洲愉拍自拍另类高清精品| 亚洲国产一区二区a毛片| 性做久久久久久久久| 国内精品免费**视频| 国产成人aaaa| 色偷偷成人一区二区三区91| 欧美久久久久久久久中文字幕| 日韩欧美123| 国产精品毛片久久久久久久| 一区二区国产盗摄色噜噜| 久久国内精品自在自线400部| 懂色一区二区三区免费观看| 91久久精品日日躁夜夜躁欧美| 日韩一区二区免费高清| 久久精品视频一区二区三区| 一区二区三区不卡视频在线观看| 五月综合激情网| 99久久免费视频.com| 日韩精品一区二区三区中文不卡| 中文在线免费一区三区高中清不卡| 亚洲综合一区在线| 国产一区二区剧情av在线| 欧美性猛片aaaaaaa做受| 久久久久久久精| 日韩在线播放一区二区| www.欧美.com| 精品美女一区二区三区| 夜夜嗨av一区二区三区中文字幕| 国产一区二区三区在线观看免费视频| 色综合激情五月| 中文字幕av不卡| 老司机精品视频线观看86|