天天看點

Go語言開發小技巧&易錯點100例(一)

全民制作人們大家好,我是練習時長兩年半的個人練習生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 {}
}
           

繼續閱讀