Go語言之append函數

來源:互聯網
上載者:User
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]這個地址所指向的值發生了改變,也不會影響到最後的結果。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.