Go语言常见错误分析
Hello,欢迎来到我的Go语言学习笔记,这一篇我们一起来看看Go语言中一些常见错误,以及一些容易被人误解的地方。(另外,也欢大家迎浏览我的上一篇笔记:详解Go Testing😀) 为了突出问题,下面举的某些例子可能比较极端,还望大家不要纠结例子的使用场景,明白其中的错误原因即可。另外,欢迎大家补充示例🫵。 Bugs🐞 变量遮蔽(shadowing)🥷🏿 在 Go 中,变量遮蔽(variable shadowing)指的是在内部作用域中声明一个与外部作用域中同名的变量,从而覆盖了外部作用域中的变量。这种bug比较低级,但是可能会出现在比较负载的函数里,而且比较隐蔽,不容易被发现。 下面是一个简单的例子,findTarget从给定strs中查找第一个target,返回索引。但是这个简单的函数存在变量遮蔽的bug(到Go Playground运行),返回值永远是-1。 func findTarget(strs []string, target string) (i int) { i = -1 for i := 0; i < len(strs); i++ { if strs[i] == target { break } } return i } 危险的map😈 未初始化 Go语言中未初始化的变量的值为此变量类型的默认值,map的默认值为nil,读值为nil的map是安全的,但是对nil的map进行写操作会引发Panic。(到Go Playround运行) func main() { var m map[string]int // read from nil map, should not panic println(m["a"]) // write to nil map, panic!!! m["a"] = 1 println(m["a"]) } 并行读写map Go语言的禁止多个goroutine同时读和写map(会引发Panic),因此如果有并行操作map的需求,必须使用锁。下面是一个在不加锁的情况下并行读写map的示例,程序会Panic(到Go Playground运行)。 ...