0
点赞
收藏
分享

微信扫一扫

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

解决方式

将dao层的结构体移到一个新包中,并且dao和utils都引用这个新包。

这个错误也告诉我们一个道理,就是代码要注意划分层次,低内聚,才能更好的增加代码的可读性。

举报

相关推荐

0 条评论