Why your golang sucks:每个人都会踩的GO的五十个坑 (11-20)
本文翻译自 50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs
Go语言是一个简单却蕴含深意的语言。但是,即便号称是最简单的C语言,都能总结出一本《C陷阱与缺陷》,更何况Go语言呢。Go语言中的许多坑其实并不是因为Go自身的问题。一些错误你再别的语言中也会犯,例如作用域,一些错误就是对因为 Go 语言的特性不了解而导致的,例如 range。
11.字符串赋值为 nil
级别:新手入门级
go的string类型变量无法赋值为nil,也无法与nil进行比较操作。string对应的空值是”“
nil类似于C/C++中的NULL,另外,Objective C和JAVA的String是可以赋值为NULL的。
错误代码:
package main
func main() {
var x string = nil //error
if x == nil { //error
x = "default"
}
}
错误信息:
# command-line-arguments
./50demo.go:28: cannot use nil as type string in assignment
./50demo.go:30: invalid operation: x == nil (mismatched types string and nil)
修正代码:
package main
func main() {
var x string //defaults to "" (zero value)
if x == "" {
x = "default"
}
}
12.数组被当做函数入参进行传递
级别:新手入门级
在C/C++中,入参如果是一个数组的话,那么实际上传递的是这个数组的指针,在函数内对该指针进行修改,是可以修改到原本数组的内容。
在GO语言中,数组Array作为函数入参是传该数组的一个拷贝,在函数内对数组成员进行修改并不会影响原有数组;切片Slice作为入参则会传指针那么数组对你而言就是指针,对切片进行修改会影响原有的切片成员。
PS:
a [3]int,这是一个数组
b []int,这是一个切片
需要明辨数组和切片的区别
package main
import "fmt"
func main() {
x := [3]int{1,2,3}
func(arr [3]int) {
arr[0] = 7
fmt.Println(arr) //prints [7 2 3]
}(x)
fmt.Println(x) //prints [1 2 3] (not ok if you need [7 2 3])
}
如果需要修改原数组的数据,则需要使用数组指针。
package main
import "fmt"