append屬于內(nèi)置函數(shù)未蝌,用于 slice 的元素添加操作寄锐。
slice?在操作時需要注意:slice?底層指向一個數(shù)據(jù)击蹲,相當于一個 view毡琉。因此在做 append?操作時必須要注意當?shù)讓訑?shù)組無法容納新增元素時要尔,append會分配一個更大數(shù)組來容納 slice舍杜,從而導致 slice?指向的底層數(shù)組變化。
觀察以下代碼:
ia := [...]int{1,2,3,4,5}????
ia2 := ia[1:3]????
ia2 = append(ia2,6,7,8,9)? ? ?
fmt.Println(ia,ia2)
打印的結(jié)果為:
[1 2 3 4 5] [2 3 6 7 8 9]
因為原始的 ia?數(shù)組無法容納之后的 6盈电,7蝴簇,8,9匆帚,因此append直接分配了一個新的底層數(shù)組熬词。
觀察以下代碼:
ia := [...]int{1,2,3,4,5}????
ia2 := ia[1:3]????
for i := 6;i < 10;i++ {???????
????ia2 = append(ia2,i)????
}? ? ?
fmt.Println(ia,ia2)
輸出結(jié)果為:
[1 2 3 6 7] [2 3 6 7 8 9]
差異原因很清晰。
因此在做 append?操作時,一定要將 append?的結(jié)果重新賦值給一個 slice互拾,防止由于底層數(shù)組的變更導致的數(shù)據(jù)錯誤歪今。