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
解决方式:
将dao层的结构体移到一个新包中,并且dao和utils都引用这个新包。
这个错误也告诉我们一个道理,就是代码要注意划分层次,低内聚,才能更好的增加代码的可读性。