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