go容易犯錯的30個陷阱

「本文已參與好文召集令活動,點擊查看:後端、大前端雙賽道投稿,2萬元獎池等你挑戰!前端

當心指針的陷阱

image.png

  1. tom是指向user的指針,name=tom
  2. tom賦值給jack
  3. jack修改name=jack
  4. tom.name也變爲jack

struct賦值的順序

image.png age雖然在name以前,可是由於name是函數fmt.Sprintf的返回值,因此在初始化user的時候,會先處理成員變量是表達式的返回值的。golang

defer panic return的順序

image.png do something->do defer->panicjson

image.png do something->do defer->return後端

json number反射到interface的坑

image.png json number反射到interface上,這時經過斷言爲int是錯誤的,此時interface斷言是float64。數組

當心for循環臨時變量和goroutine組合的坑

image.png i是臨時變量,當每一個goroutine搶着去打印i的時候,其結果是不肯定的,每一個gourotine運行到的時候,i當前是什麼,就打印什麼。markdown

range一個chan的時候,記得在close,否則會deadlock

image.png

map是要初始化的,否則會報nil map

image.png

從map中取不存在key的時候,返回的是對應的零值

image.png 能夠經過if v,ok := x["two"]; ok來判斷app

byte和rune傻傻分不清楚

image.png byte表示字節,一箇中文正常3個字節,rune用來表示Unicode的碼點,即一個字符。函數

代碼塊內同名變量的修改,不會影響代碼塊外的值

image.png

range map是無序的

image.png

nil != nil

image.png 當心nil != nil的陷阱。golang的interface是由兩個部分組成的,{Type, Value},a至關於{nil,nil},b至關於{*int,nil},a天然不等於b。post

當心你的類型溢出

image.png 這裏其實會卡住,首先byte本質是uint8,最大值是255,當到達255後,先加1,就會發生溢出,回到0,因此這行代碼本質就是個for{}ui

給一個已經close的channel發數據會panic

image.png

從一個已經close的channel收數據會收到零值

image.png

經過context timeout來控制超時

image.png

make和new的區別

image.png 經過定義能夠看出new返回的是指針,make返回的類型的值。make能夠是slice、map和chan,new能夠new一個類型。

append擴容致使的底層數組的變化

image.png 最後一次append,原數組容量不夠,從新分配數組。地址變化。

go搶佔式調度

image.png 在只有一個處理器的狀況下,即便一個goroutine是死循環,它也不會一直執行下去

select的隨機性

image.png

無緩衝和有緩衝的chan的區別

image.png 無緩衝的chan,是同步阻塞的,必須存在某個時刻,在寫的同時,另外一個已經在準備接收了。帶緩衝的chan,在緩衝區沒滿的時候,是不阻塞的。

... 來接收可變長參數

image.png

儘可能使用小內存字段

image.png 根據所需,選擇合理的類型,對GC友好。

空struct不佔空間

image.png

兩個無符號的數字最好不要相減,不會獲得負數

image.png

go的strcut是能夠比較的

image.png

map、slice、func不可比較,除非是nil

image.png

注意close你的http body,防止內存泄露

image.png

註冊recover,防止panic致使的程序意外退出

image.png

go 語句後面的函數調用,其參數會先求值

image.png 因此以上會deadlock

相關文章
相關標籤/搜索