golang易錯題收集
阿新 • • 發佈:2020-08-03
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.
參考: