坑爹代碼 | Go 語言的 defer 能製造出多少坑來?

←手機掃碼閱讀     admin @ 2019-06-13 , reply:0

Go 語言的 defer 語句是一個非常有用的特性,可以將一個方法延遲到包裹該方法的方法返回時執行,在實際應用中,defer 語句可以充當其他語言中try…catch…的角色,也可以用來處理關閉文件句柄等收尾操作。

相信很多初學者已經被上面加粗這句話搞懵逼了。而這種神乎其技的特性就是引發各種坑的元兇。

下面這段代碼執行超乎預期:


package main

import "fmt"

type Slice []int

func NewSlice() Slice {
	return make(Slice, 0)
}

func (s *Slice) Add(elem int) *Slice {
	*s = append(*s, elem)
	fmt.Print(elem)
	return s
}

func main() {
	s := NewSlice()
	defer s.Add(1).Add(2) // 這裡先執行前面的Add,最後一個不執行,函數結束后再執行最後一個Add 執行結果 132
	// defer s.Add(1).Add(2).Add(4) // 這裡執行的結果是 1234
	s.Add(3)
}

那麼如何使用 defer 語句才能避免不可預料的事情發生呢?

請移步下面鏈接發表評論,領取獎品:

https://gitee.com/oschina/bullshit-codes/blob/master/golang/panic_defer.go

 

碼雲 6 周年,我們正在徵集各種坑爹代碼,很多獎品等你來拿

詳細的參與方法請看  https://gitee.com/oschina/bullshit-codes

------ 分割線 ------

其他坑爹代碼吐槽:

  • 坑爹代碼 | 這樣使用 StringBuffer 的方法有什麼坑?
  • 坑爹代碼 | 你寫過的最長的一行代碼有多長???
  • 坑爹代碼 | 循環+條件判斷,你最多能嵌套幾層?
  • 坑爹代碼 | 為了後期優化查詢速度 ~ 頗有商業頭腦!
  • 坑爹代碼 | 你是如何被異常玩然後變成玩異常的?
  • 坑爹代碼 | Stream 玩得最 6 的代碼,看過的人都驚呆了




[admin ]

來源:OsChina
連結:https://www.oschina.net/news/107411/github-bullshit-code-with-go-defer
坑爹代碼 | Go 語言的 defer 能製造出多少坑來?已經有26次圍觀

http://coctec.com/news/soft/show-post-207070.html