go append函數以及寫入

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

切片

切片有兩種初始化方法,一種是字面量初始化,一種是make
不建議使用new
新增成員時,容量是2的指數遞增的,2,4,8,16,32。而且是在長度要超過容量時,才增加容量。

append函數

append(type,len,cap)該函數第一個參數是類型,第二個參數是分配的空間,第三個參數是預留分配空間
a:=make([]int, 5, 10)a[4]// 正確a[5]//報錯

這是因為cap預留的空間需要重新切片才可以使用,例如動態追加的時候重新分配空間之類。
也可以手動分配

func main(){    a := make([]int, 10, 20)    fmt.Println(a)    b := a[:cap(a)]    fmt.Println(b)}//[0 0 0 0 0 0 0 0 0 0]//[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

是將一個元素追加到數組的最後,他是go的內建函數。
當我們用append追加元素到切片時,如果容量不夠,go就會建立一個新的切片變數
因此append是動態增加的。不用擔心 出現 index out of range的錯誤。

var s []string s= append(s ,"last")

append比較適合用字面量初始的切片。
因為make傳入初始大小後,我們得到的實際上是一個含有這個size數量切片類型的空元素。此時使用append會在空元素之後再追加。

func main(){    var s=make([]string,10);    s=append(s,"last");    print(s)}// ["0","0","0","0","0","0","0","0","0","0","last"]

如果要繼續使用make來初始化的話,那麼需要用到第三個參數,“cap”

func main(){    var s=make([]string,0,10);    s=append(s,"last");    print(s)}// ["last"]

append局限性

但有其局限性,例如不能用在

type mystruct{mystring string }type mystruct2{mystring2 string }var a []mystructvar b []mystruct2for _, item := range b{    b=append(a.mystring,item.mystring2)}

而想要可以給對象數組的子屬性 ,按照數組的原定順序添加(因此也不能直接把a變成map遍曆了,除非按照某種順序重新排序),想到的一個方法是使用直接賦值運算式

for index, item := range b{   a[index].mystring=item.mystring2}

但是這樣會報錯,提示index out of range .因為a聲明是預設初始化長度為0的。
改為——

var b []mystruct2a := make([]mystruct,len(b))for index, item := range b{   a[index].mystring=item.mystring2}

這樣就可以解決了。
又如果,需要在迴圈裡面篩選所需要的資料,則此時len(b)是b數組全部資料的長度。而切片給出初始大小後,得到的實際上是一個含有這個size數量切片類型的空元素。
因此沒有被賦值的部分,仍然是“空”。

// a=[{"A"},{"B"},{"C"},{"D"}]var b []mystruct2a := make([]mystruct,len(b))for index, item := range b{if(index/2!=0){//奇數index   a[index].mystring=item.mystring2   }}//a=[{"A"},{},{"C"},{}]

則在對a做一些操作的時候(例如翻轉)會出現一些空資料,取首位元素會取不到。

//a=[{"A"},{},{"C"},{}]func InvertedOrder(arr []mystruct)([]mystruc){    for from , to := 0 , len(arr) -1 ; from < to ; from , to = from + 1, to -1{        arr[from] , arr[to] = arr[to] , arr[from]    }    return arr}a_invert := InvertedOrder(a)//a=[{},{"C"},{},{"A"}]

一個比較low的方法是計數,然後重新切片

var countfor index, item := range b{if(index/2!=0){//奇數index    count++   a[count-1].mystring=item.mystring2   }}a=a[:count]

沒有想到其他比較好的方法,初始化slice 的容量並不是可收縮的,用不上

參考

https://studygolang.com/artic...

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.