記兩個未初始化而導致的坑

xing393939發表於2020-12-02

第一個坑sync.Map

var root = sync.Map{}
var child sync.Map
child.Store("key0", "0")
root.Store("child", child)
child.Store("key1", "1")
log.Println(root.Load("child"))
/*
如果去掉第三行,列印的child值將是空的。
如果去掉第三行,把第二行換成var child = sync.Map{},列印的child值仍然是空的。
*/

第二個坑Channel

var ch chan int
go func() {
    ch <- 1
}()
go func() {
    <-ch
}()
time.Sleep(time.Second)
/*
這裡如果ch的接收是在主執行緒,則編譯器可以檢查出錯誤:all goroutines are asleep - deadlock。可是如果在子執行緒裡,只會阻塞而沒有任何錯誤,不仔細檢查程式碼根本發現不了問題!
*/
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章