Go语言错误总结(一)北京老男孩go语言周末班培训

    /    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() {
    := make(map[string]int, 99)
    cap(m)
}


编译错误:

./main.go:5:5: invalid argument m (type map[string]intfor 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{123}
    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{123}
    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{12

(22)

分享至