這是我在寫一個項目中,遇到的一個golang的feature,如代碼所示,我在for循環里,每次用append生成一個新的數組,(當然我以前一直以為可以這樣,直到我在stackoverflow上發現不能。)然后將這個數組追加到一個大數組里(二維數組),這時候發現并不如預期那樣,似乎每次append沒有返回新數組,然而,當我把一開始生成的5修改為2的時候,卻是正常的,如果都不正常也好理解,有時正常有時不正常的行為難以琢磨,請懂go底層實現的大牛牛們解釋一下為啥會這樣呢?
stackoverflow上類似的問題是:
http://stackoverflow.com/ques...
基本上和我的差不多,最后我也是使用答案中建議的方式copy來解決的。
package mainimport ("fmt"
)func main() {arr := make([]int, 0)for i := 0; i < 5; i++ { // 如果將此處的 5 修改為 2,可以看到 [0 1 0] [0 1 1] 運行如預期arr = append(arr, i)}var list [][]intfor _, v := range arr {vi := append(arr, v)fmt.Println(vi)/** 注意此處的vi依次為* [0 1 2 3 4 0]* [0 1 2 3 4 1]* [0 1 2 3 4 2]* [0 1 2 3 4 3]* [0 1 2 3 4 4]*/// 但是追加進去后,末尾的最后一位全部變成了4list = append(list, vi)}fmt.Println(list)// 最后的list 卻為:/*** [* [0 1 2 3 4 4]* [0 1 2 3 4 4]* [0 1 2 3 4 4]* [0 1 2 3 4 4]* [0 1 2 3 4 4] ]** 看起來,似乎go在底層每次使用的是同一個vi,并且vi最后被修改成了最后一次的值4. 鵝妹子嚶!**/
}
運行結果地址:
https://wide.b3log.org/playgr...
將5修改為2后:
https://wide.b3log.org/playgr...
append生成新變量的時候,沒有如預期(It's a feature,not a bug?) >> golang
這個答案描述的挺清楚的:
http://www.goodpm.net/postreply/golang/1010000008897291/append生成新變量的時候沒有如預期Itsafeaturenotabug.html