golang map的無序性驗證

2021-10-18 14:27:47 字數 3638 閱讀 8137

大量資料如果沒有寫入,只是讀取不會出錯

var wg sync.waitgroup

m :=

make

(map

[int

]int

)for i :=

0; i <

10000

; i++

wg.add(

100000

)for i :=

0; i <

10; i++}(

)}wg.

wait()

//執行結果 無序

//...

//第10個go程 key:7410-value:7410

//第10個go程 key:2710-value:2710

//第10個go程 key:5388-value:5388

//第10個go程 key:9667-value:9667

//第10個go程 key:477-value:477

//第10個go程 key:579-value:579

//第10個go程 key:3405-value:3405

順帶乙個map引用傳遞的問題,其實傳值或者傳位址,都沒有發生拷貝

傳遞的其實是map的引用,沒有發生拷貝

var wg sync.waitgroup

m :=

make

(map

[int

]int

)for i :=

0; i <

3; i++

fmt.

printf

(,m)

wg.add(2)

for i :=

0; i <

2; i++

fmt.

printf

(, m, m1)

wg.done()

}(i,m)

} wg.

wait()

//第1個go程 key:0-value:0

//第1個go程 key:1-value:1

//第1個go程 key:2-value:2

//,map區域性變數位址0xc000071bc0

//第0個go程 key:0-value:0

//第0個go程 key:1-value:1

//第0個go程 key:2-value:2

//,map區域性變數位址0xc000071bc0

map引用傳遞
var wg sync.waitgroup

m :=

make

(map

[int

]int

)for i :=

0; i <

3; i++

fmt.

printf

(,m)

wg.add(2)

for i :=

0; i <

2; i++

fmt.

printf

(, m,

*m1)

wg.done()

}(i,

&m)}

wg.wait()

//第1個go程 key:0-value:0

//第1個go程 key:1-value:1

//第1個go程 key:2-value:2

//,map區域性變數位址0xc000202b40

//第0個go程 key:0-value:0

//第0個go程 key:1-value:1

//第0個go程 key:2-value:2

//,map區域性變數位址0xc000202b40

這裡有個疑問,為什麼切片不用引用傳遞

var wg sync.waitgroup

s :=

make([

]int,3

)for i :=

0; i <

len(s)

; i++

fmt.

printf

(,s)

wg.add(2)

for i :=

0; i <

2; i++

fmt.

printf

("slice go程裡面位址%p\n"

, s)

wg.done()

}(i)

} wg.

wait()

//第1個go程 key:0-value:0

//第1個go程 key:1-value:1

//第1個go程 key:2-value:2

//slice go程裡面位址0xc000010860

//第0個go程 key:0-value:0

//第0個go程 key:1-value:1

//第0個go程 key:2-value:2

//slice go程裡面位址0xc000010860

var wg sync.waitgroup

s :=

make([

]int,3

)for i :=

0; i <

len(s)

; i++

fmt.

printf

(,s)

wg.add(2)

for i :=

0; i <

2; i++

fmt.

printf

(, s, s1)

wg.done()

}(i, s)

} wg.

wait()

//第1個go程 key:0-value:0

//第1個go程 key:1-value:1

//第1個go程 key:2-value:2

//,slice區域性變數位址0xc000208080

//第0個go程 key:0-value:0

//第0個go程 key:1-value:1

//第0個go程 key:2-value:2

//,slice區域性變數位址0xc000208080

var wg sync.waitgroup

s :=

make([

]int,3

)for i :=

0; i <

len(s)

; i++

fmt.

printf

(,s)

wg.add(2)

for i :=

0; i <

2; i++

fmt.

printf

(, s,

*s1)

wg.done()

}(i,

&s)}

wg.wait()

//第0個go程 key:0-value:0

//第0個go程 key:1-value:1

//第0個go程 key:2-value:2

//,slice區域性變數位址0xc00019a060

//第1個go程 key:0-value:0

//第1個go程 key:1-value:1

//第1個go程 key:2-value:2

//,slice區域性變數位址0xc00019a060

Golang map的底層實現

並修改 map是go語言中基礎的資料結構,在日常的使用中經常被用到。但是它底層是如何實現的呢?總體來說golang的map是hashmap,是使用陣列 鍊錶的形式實現的,使用拉鍊法消除hash衝突。golang的map由兩種重要的結構,hmap和bmap 下文中都有解釋 主要就是hmap中包含乙個指...

golang map轉json的順序問題

我們都知道map是無序的,每次取出key value的順序都可能不一致,但map轉json的順序是不是也是無序的嗎?儘管json中的引數順序大部分情況下對使用沒有影響,我們不妨看看原始碼中怎麼處理的。先說結論 map轉json是有序的,按照ascii碼公升序排列key。原始碼位於encoding j...

驗證性實驗

1 使用 ipconfig all 檢視自己計算機的網路配置 1 使用 tracert www.baidu.com 命令,檢視反饋的資訊,了解節點的個數。1 執行 arp a 命令檢視當前的 arp 快取 2 使用 arp 命令了解該命令的各種選項 3 假設當前閘道器的 ip 位址是 192.168...