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

Golang如何快速刪除map所有元素

 更新時間:2023年11月22日 15:24:54   作者:風(fēng)神韻  
這篇文章主要介紹了Golang如何快速刪除map所有元素問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

1. 所有Go版本通用方法

重新申請一個新的map,舊的map交給GC去回收。

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)遍歷刪除所有元素時,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)化選項后,Go編譯器直接通過循環(huán)遍歷來刪除map里面的元素。

由上可知,遍歷刪除在經(jīng)過編譯器優(yōu)化后會調(diào)用mapclear一次性刪除map所有元素,那這個mapclear函數(shù)是如何實現(xiàn)的,效率如何?

mapclear源碼實現(xiàn)

這部分代碼涉及到內(nèi)存管理和GC,只能看懂個大概,后續(xù)再補(bǔ)充。

實現(xiàn)思路

  • 清空統(tǒng)計數(shù)據(jù),如元素個數(shù)、溢出數(shù)等。
  • 重新申請一個新的extra,原有的extra交給GC。
  • 釋放桶內(nèi)存塊。
func mapclear(t *maptype, h *hmap) {
	...
	
	// 把oldbuckets置nil,如果有oldbuckets就讓GC處理
	h.oldbuckets = nil

	// 初始化溢出數(shù)、元素個數(shù)
	h.nevacuate = 0
	h.noverflow = 0
	h.count = 0	

	// 重新申請一個新的extra,舊的交給GC回收
	if h.extra != nil {
		*h.extra = mapextra{}
	}

	// 清空bucket
	_, nextOverflow := makeBucketArray(t, h.B, h.buckets)
	...
}

func makeBucketArray(t *maptype, b uint8, dirtyalloc unsafe.Pointer) (buckets unsafe.Pointer, nextOverflow *bmap) {
	base := bucketShift(b)
	nbuckets := base
	...
	
	// 沒有分配過內(nèi)存,則申請一個新的
	if dirtyalloc == nil {
		buckets = newarray(t.bucket, int(nbuckets))
	} else {
		// 直接釋放整個buckets
		buckets = dirtyalloc
		size := t.bucket.size * nbuckets
		if t.bucket.kind&kindNoPointers == 0 {
			memclrHasPointers(buckets, size)
		} else {
			memclrNoHeapPointers(buckets, size)
		}
	}
	...
}

總結(jié)

使用mapclear方法清空map時,做的工作就是初始化和釋放申請內(nèi)存塊,效率很高。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解golang中模板的常用語法

    詳解golang中模板的常用語法

    這篇文章主要介紹了golang模板中的常用語法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Go語言中Map的神奇操作小結(jié)

    Go語言中Map的神奇操作小結(jié)

    Map是一個強(qiáng)大而又有趣的工具,它可以幫助我們高效地存儲和操作鍵值對數(shù)據(jù),本文主要介紹了Go語言中Map的各種操作,包括增加、查找、刪除、遍歷等,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • grom設(shè)置全局日志實現(xiàn)執(zhí)行并打印sql語句

    grom設(shè)置全局日志實現(xiàn)執(zhí)行并打印sql語句

    本文主要介紹了grom設(shè)置全局日志實現(xiàn)執(zhí)行并打印sql語句,包括設(shè)置日志級別、實現(xiàn)自定義Logger接口以及如何使用GORM的默認(rèn)logger,通過這些方法,可以更好地控制和記錄數(shù)據(jù)庫操作的日志信息
    2025-03-03
  • golang gin 框架 異步同步 goroutine 并發(fā)操作

    golang gin 框架 異步同步 goroutine 并發(fā)操作

    這篇文章主要介紹了golang gin 框架 異步同步 goroutine 并發(fā)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 詳解golang開發(fā)中select多路選擇

    詳解golang開發(fā)中select多路選擇

    這篇文章主要介紹了golang開發(fā)中select多路選擇,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 詳解go語言是如何實現(xiàn)協(xié)程的

    詳解go語言是如何實現(xiàn)協(xié)程的

    go語言的精華就在于協(xié)程的設(shè)計,只有理解協(xié)程的設(shè)計思想和工作機(jī)制,才能確保我們能夠完全的利用協(xié)程編寫強(qiáng)大的并發(fā)程序,所以本文將給大家介紹了go語言是如何實現(xiàn)協(xié)程的,文中有詳細(xì)的代碼講解,需要的朋友可以參考下
    2024-04-04
  • GO語言make()分配用法實例

    GO語言make()分配用法實例

    這篇文章主要介紹了GO語言make()分配用法,實例分析了make()的功能及使用技巧,需要的朋友可以參考下
    2015-02-02
  • 詳解Go 1.22 for循環(huán)的兩處重要更新

    詳解Go 1.22 for循環(huán)的兩處重要更新

    這篇文章主要詳細(xì)介紹了Go 1.22 for循環(huán)的兩處重要更新,Go 1.22 版本于 2024 年 2 月 6 日發(fā)布,引入了幾個重要的特性和改進(jìn),在語言層面上,這個版本對 for 循環(huán)進(jìn)行了兩處更新,本文將會對 for 循環(huán)的兩個更新進(jìn)行介紹,需要的朋友可以參考下
    2024-02-02
  • go中import包的大坑解決方案

    go中import包的大坑解決方案

    最近開始使用Go/GoLand 在import 自定義包時出現(xiàn)各種狀況,本文就介紹一下go中import包的大坑解決方案,具有一定的參考價值,感興趣 可以了解一下
    2022-06-06
  • Go中的gRPC入門教程詳解

    Go中的gRPC入門教程詳解

    本文詳細(xì)講解了Go中的gRPC入門教程,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03

最新評論

江西省| 黄冈市| 贡觉县| 宣城市| 贵港市| 安丘市| 肇州县| 保山市| 北宁市| 黄龙县| 灵寿县| 锡林浩特市| 房山区| 满洲里市| 满洲里市| 顺昌县| 新干县| 德保县| 苏尼特左旗| 修水县| 西华县| 上犹县| 岱山县| 阜平县| 永年县| 张掖市| 民丰县| 阜康市| 班玛县| 卢氏县| 根河市| 平阳县| 合阳县| 桃江县| 南安市| 阳城县| 榆中县| 灵宝市| 西和县| 安阳县| 淮滨县|