1. 程式人生 > 實用技巧 >golang易錯題收集

golang易錯題收集

1. 變數作用域

var p *int

func foo() (*int, error) {
    var i int = 5
    return &i, nil
}

func bar() {
    //use p
    fmt.Println(*p)
}

func main() {
    p, err := foo()
    if err != nil {
        fmt.Println(err)
        return
    }
    bar()
    fmt.Println(*p)
}

runtime error

問題出在操作符:=,對於使用:=定義的變數,如果新變數與同名已定義的變數不在同一個作用域中,那麼 Go 會新定義這個變數。對於本例來說,main() 函式裡的 p 是新定義的變數,會遮住全域性變數 p,導致執行到bar()時程式,全域性變數 p 依然還是 nil,程式隨即 Crash。

2.迴圈次數在迴圈開始前就已經確定

func main() {
    v := []int{1, 2, 3}
    for i := range v {
        v = append(v, i)
    }
}

迴圈次數在迴圈開始前就已經確定,迴圈內改變切片的長度,不影響迴圈次數。

[1 2 3 0]
[1 2 3 0 1]
[1 2 3 0 1 2]

3.

參考:

1.http://mian.topgoer.com/