append函數的作用 官方解釋append函數是向slice裡面追加一個或多個元素,然後返回一個和slice一樣類型的slice,其簽名為
func append(slice []T, elements...T) []T
append 所做的是在切片尾添加元素並返回結果。結果需要返回因為,正如我們手寫的 Append,底層的數組可能更改。 使用樣本:
x := []int{1,2,3} x = append(x, 4, 5, 6) fmt.Println(x)
列印輸出值1 2 3 4 5
使用過程的坑 在使用過程中有以下的坑:
var CateOut []*Categoryvar Cate []*Category={cate1,cate2,....,cate10}//已經初始化好的值for j := 0; j < 10; j++ { CateOut = append(CateOut, cate[i]) }
上面的代碼運行出來的CateOut結果為10個Cate[9]的值,其中Category為一個struct,但是需要的結果是CateOut完全複製Cate的值,坑。。。。 解決方案,把上述的代碼加上臨時變數temp,即為:
var CateOut []*Categoryvar Cate []*Category={cate1,cate2,....,cate10}//已經初始化好的值for j := 0; j < 10; j++ { var temp *Category temp=cate[i] CateOut = append(CateOut, temp) }
問題神奇的就解決了,一臉懵逼。。。 初步分析:應該是每經過一次for迴圈時都需要新建立一個臨時變數temp,用這個乾淨的臨時變數去取值然後賦給CateOut。
總結:如果不用temp,則每次賦值給CateOut的cate[i]本身就是一個地址,例如”AAA”,這個地址本身並沒有改變,改變的只是這個地址指向的對象,因此原先的CateOut結果值會是[AAA],[AAA AAA],[AAA AAA AAA]...即每次增加一個完全相同的地址值,但是在之後的運行過程中地址AAA指向的值已經改變了,所以結果出錯。但使用temp就不一樣了,每次產生一個新的變數值,把新的地址賦給它,CateOut結果值會是[AAA],[AAA BBB],[AAA BBB CCC]...,這樣即使cate[i]這個地址所指向的值發生了改變,也不會影響到最後的結果。