全民制作人們大家好,我是練習時長兩年半的個人練習生Barry Yan,喜歡唱、跳、Coding、羽毛球,Music!
今天給大家帶來的這一檔文章呢,主要是總結一下自己Coding過程中遇到的問題以及平時讀一些部落格的所得,因為做gopher也有了一段時間了,相比Java,有些問題的出現想要利用搜尋引擎排查出來可能不是那麼的迅速,是以在這裡以文章的形式總結出來也友善各位初出茅廬的gopher們能夠順利的解決所遇到的問題,并能夠習得一些小技巧。
為什麼叫《Go語言開發小技巧&易錯點100例》呢,說實話我也不知道能不能寫到100例,隻能說作為自己的一個小目标吧,先賺它一個億,哈哈哈,隻有目标才能促使自己不斷Coding,不斷發現和總結問題,相信到最後肯定要多于100個的,今天就先來9個!
**先羅列一下吧(技巧類用【技】表示,易錯點用【易】表示)**:
(1)return傳回值屏蔽【技】
(2)context繼承【易】
(3)禁止main退出【技】
(4)map周遊次序【易】
(5)main函數提前退出【易】
(6)包循環依賴【易】
(7)fallthrough關鍵字【技】
(8)簡式變量聲明(i:=1)僅能在函數内部使用【易】
(9)interface斷言【易】
正文:
1 return傳回值屏蔽【技】
傳回值屏蔽的概念就是直接return也能傳回函數的傳回值,但是需要将傳回值進行指派操作,比如我們定義一個函數:
func method(parm string) string
,傳回值為string類型,實作函數時就會要求我們必須要return一個string類型的變量,但是如下的代碼示例中直接一個return,并且也能正常執行
func Hello(name string) (str string) {
str = "Hello World"
if name != "" {
return "Hello " + name
}
return
}
func main() {
fmt.Println(Hello(""))
fmt.Println(Hello("zs"))
}
運作結果:
Hello World
Hello zs
這就是傳回值屏蔽的效果,但是要想實作,就必須也要像定義參數一樣去定義傳回值,如
func method(parm string) res string
,就可以直接進行return了。
2 context繼承【易】
衆所周知,在Go開發中context包是一個很常用并且重要的包,
func Handler(ctx context.Context) {
fmt.Println(ctx.Value("name"))
fmt.Println(ctx.Deadline())
}
func Controller(ctx context.Context) {
fmt.Println(ctx.Value("name"))
fmt.Println(ctx.Deadline())
ctx = context.WithValue(ctx, "name", "ls")
ctx, _ = context.WithTimeout(ctx, time.Second*10)
Handler(ctx)
}
func main() {
ctx := context.WithValue(context.Background(), "name", "zs")
ctx, _ = context.WithTimeout(ctx, time.Second*5)
Controller(ctx)
}
運作結果:
zs
2022-10-15 14:38:46.0456413 +0800 CST m=+5.005663601 true
ls
2022-10-15 14:38:46.0456413 +0800 CST m=+5.005663601 true
context的部分規則如下:
- WithCancel:基于父級 context,建立一個可以取消的新 context。
- WithDeadline:基于父級 context,建立一個具有截止時間(Deadline)的新 context。
- WithTimeout:基于父級 context,建立一個具有逾時時間(Timeout)的新 context。
- Background:建立一個空的 context,一般常用于作為根的父級 context。
- TODO:建立一個空的 context,一般用于未确定時的聲明使用。
- WithValue:基于某個 context 建立并存儲對應的上下文資訊。
一般會有父級
context
和子級
context
的差別,我們要保證在程式的行為中上下文對于多個
goroutine
同時使用是安全的。并且存在父子級别關系,父級
context
關閉或逾時,可以繼而影響到子級
context
的程式。
3 禁止main退出【技】
func main() {
defer func() {for {}}()
// TODO
}
func main() {
defer func() { select {} }()
// TODO
}
func main() {
// TODO
select {}
}