天天看點

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

4 map周遊次序【易】

Go語言中map的周遊次序是無序的哈

func main() {
   m := make(map[string]string)
   m["A"] = "a"
   m["B"] = "b"
   m["C"] = "c"
   m["D"] = "d"
   m["E"] = "e"
   for i := range m {
      fmt.Println(i)
   }
}
           

運作結果:

C
D
E
A
B
           

5 main函數提前退出【易】

你是否遇見過這種情況:

func main() {
   go func() {
      fmt.Println("Hello goruntine")
   }()
   fmt.Println("Hello main")
}
           

運作結果:

第一次運作:
Hello main

第n次運作:
Hello main
Hello goruntine

第n+1次運作:
Hello goruntine
Hello main
           

為什麼會導緻這樣的結果呢?

答案就是多線程,并且他們的線程并不是互斥的。

解決方式:

不專業的方式

func main() {
   go func() {
      fmt.Println("Hello goruntine")
   }()
   fmt.Println("Hello main")
   time.Sleep(time.Second * 5)
}
           

專業的方式

func main() {
   group := sync.WaitGroup{}
   group.Add(1)
   go func() {
      defer group.Done()
      fmt.Println("Hello goruntine")
   }()
   fmt.Println("Hello main")
   group.Wait()
}
           

6 包循環依賴錯誤【易】

先說明下場景:

我們在dao層的檔案中定義結構體和其相關的dao層方法,但是在調用方法時(如插入資料的方法)會使用utils包中的工具方法對參數進行檢查,而utils中的工具方法需要引用dao層的結構體才能夠檢查,是以出現了dao依賴utils包,utils包依賴dao包的情況,就導緻了循環依賴的異常。

dao封包件:

package dao

import (
   "fmt"
   "other/article/utils"
)

type User struct {
   Name string
}

func InsertUser() {
   utils.CheckUser()
   fmt.Println("InsertUser")
}
           

utils封包件:

package utils

import (
   "fmt"
   "other/article/dao"
)

func CheckUser() {
   user := dao.User{Name: "zs"}
   fmt.Println("CheckUser", user)
}
           

main檔案:

package main

import (
	"other/article/dao"
)

func main() {
   dao.InsertUser()
}
           

運作結果:

package command-line-arguments
	imports other/article/dao
	imports other/article/utils
	imports other/article/dao: import cycle not allowed
           

繼續閱讀