/ 2019-07-31
8、使用“nil” Slices and Maps
在一个nil的slice中添加元素是没问题的,但对一个map做同样的事将会生成一个运行时的panic。
正确代码:
package main
func main() {
var s []int
s = append(s, 1)
}
错误代码:
package main
func main() {
var m map[string]int
m["one"] = 1
}
运行错误:
panic: assignment to entry in nil map
9、Map的容量
你可以在map创建时指定它的容量,但你无法在map上使用cap()函数。
错误代码:
package main
func main() {
m := make(map[string]int, 99)
cap(m)
}
编译错误:
./main.go:5:5: invalid argument m (type map[string]int) for cap
10、字符串不会为nil
这对于经常使用nil分配字符串变量的开发者而言是个需要注意的地方。
package main
func main() {
var x string = nil
if x == nil {
x = "default"
}
}
编译错误:
./main.go:4:6: cannot use nil as type string in assignment
./main.go:5:7: invalid operation: x == nil (mismatched types string and nil)
正确代码:
package main
func main() {
var x string
if x == "" {
x = "default"
}
}
11、Array函数的参数
如果你是一个C或则C++开发者,那么数组对你而言就是指针。当你向函数中传递数组时,函数会参照相同的内存区域,这样它们就可以修改原始的数据。Go中的数组是数值,因此当你向函数中传递数组时,函数会得到原始数组数据的一份复制。如果你打算更新数组的数据,这将会是个问题。
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])
}
运行结果:
[7 2 3]
[1 2 3]
如果你需要更新原始数组的数据,你可以使用数组指针类型。
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 [7 2 3]
}
运行结果:
&[7 2 3]
[7 2 3]
另一个选择是使用slice。即使你的函数得到了slice变量的一份拷贝,它依旧会参照原始的数据。
package main
import "fmt"
func main() {
x := []int{1, 2,
(22)