写点什么

Go 中五个常见错误

用户头像
baiyutang
关注
发布于: 刚刚
Go 中五个常见错误

译者:baiyutang

原文:https://medium.com/deepsource/5-common-mistakes-in-go-2d57fbd9357b


让我们一起看看一些 Go 中常见的错误风险。

一. 无限递归调用


二. map 赋值 nil


make(map[string]int)make(map[string]int, 100)
复制代码


不好的案例:

var countedData map[string][]ChartElement
复制代码


好的案例:

countedData := make(map[string][]ChartElement)
复制代码


推荐阅读:Go: assignment to entry in nil map


三. 方法限定接收者

例如:

type data struct {	num   int	key   *string	items map[string]bool}
func (d data) vmethod() { d.num = 8}
func (d data) run() { d.vmethod() fmt.Printf("%+v", d) // Output: {num:1 key:0xc0000961e0 items:map[1:true]}}
复制代码

如果 num 必须限定:

type data struct {	num   int	key   *string	items map[string]bool}
func (d *data) vmethod() { d.num = 8}
func (d *data) run() { d.vmethod() fmt.Printf("%+v", d) // Output: &{num:8 key:0xc00010a040 items:map[1:true]}}
复制代码


四. Goroutine 中可能使用了不希望被使用的值

mySlice := []string{"A", "B", "C"}for index, value := range mySlice {	go func() {		fmt.Printf("Index: %d\n", index)		fmt.Printf("Value: %s\n", value)	}()}
复制代码


为了解决这个问题,一个局部范围必粗创建,像下面的例子:

mySlice := []string{"A", "B", "C"}for index, value := range mySlice {	index := index	value := value	go func() {		fmt.Printf("Index: %d\n", index)		fmt.Printf("Value: %s\n", value)	}()}
复制代码


另外一个处理这种问题的方式是作为参数传递给 Goroutine

mySlice := []string{"A", "B", "C"}for index, value := range mySlice {	go func(index int, value string) {		fmt.Printf("Index: %d\n", index)		fmt.Printf("Value: %s\n", value)	}(index, value)}
复制代码


发布于: 刚刚阅读数: 4
用户头像

baiyutang

关注

广州 2017.12.13 加入

Microservices | Golang | Cloud Nitive | “Smart work,Not hard”

评论

发布
暂无评论
Go 中五个常见错误