站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

go語言中切片怎么加元素

在go語言中,可以使用append()為切片動(dòng)態(tài)添加元素。append()可以向一個(gè)切片中追加一個(gè)元素、多個(gè)元素、新的切片,語法“append(切片, 元素1,元素2…)”或“append(切片,新切片…)”。使用append()函數(shù)為切片動(dòng)態(tài)添加元素時(shí),如果空間不足以容納足夠多的元素,切片就會(huì)進(jìn)行“擴(kuò)容”,此時(shí)新切片的長度會(huì)發(fā)生改變。

go語言中切片怎么加元素

本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。

在go語言中,可以使用append()為切片動(dòng)態(tài)添加元素。

Go語言 append()函數(shù)

append可以向一個(gè)slice中追加一個(gè)元素、多個(gè)元素、新的切片

var a []int a = append(a, 1) // 追加1個(gè)元素 a = append(a, 1, 2, 3) // 追加多個(gè)元素, 手寫解包方式 a = append(a, []int{1,2,3}...) // 追加一個(gè)切片, 切片需要解包
登錄后復(fù)制

不過需要注意的是,在使用 append() 函數(shù)為切片動(dòng)態(tài)添加元素時(shí),如果空間不足以容納足夠多的元素,切片就會(huì)進(jìn)行“擴(kuò)容”,此時(shí)新切片的長度會(huì)發(fā)生改變。

切片在擴(kuò)容時(shí),容量的擴(kuò)展規(guī)律是按容量的 2 倍數(shù)進(jìn)行擴(kuò)充,例如 1、2、4、8、16……,代碼如下:

var numbers []int   for i := 0; i < 10; i++ {     numbers = append(numbers, i)     fmt.Printf("len: %d  cap: %d pointer: %pn", len(numbers), cap(numbers), numbers) }
登錄后復(fù)制

代碼輸出如下:

go語言中切片怎么加元素

代碼說明如下:

  • 第 1 行,聲明一個(gè)整型切片。

  • 第 4 行,循環(huán)向 numbers 切片中添加 10 個(gè)數(shù)。

  • 第 5 行,打印輸出切片的長度、容量和指針變化,使用函數(shù) len() 查看切片擁有的元素個(gè)數(shù),使用函數(shù) cap() 查看切片的容量情況。

通過查看代碼輸出,可以發(fā)現(xiàn)一個(gè)有意思的規(guī)律:切片長度 len 并不等于切片的容量 cap。

往一個(gè)切片中不斷添加元素的過程,類似于公司搬家,公司發(fā)展初期,資金緊張,人員很少,所以只需要很小的房間即可容納所有的員工,隨著業(yè)務(wù)的拓展和收入的增加就需要擴(kuò)充工位,但是辦公地的大小是固定的,無法改變,因此公司只能選擇搬家,每次搬家就需要將所有的人員轉(zhuǎn)移到新的辦公點(diǎn)。

  • 員工和工位就是切片中的元素。

  • 辦公地就是分配好的內(nèi)存。

  • 搬家就是重新分配內(nèi)存。

  • 無論搬多少次家,公司名稱始終不會(huì)變,代表外部使用切片的變量名不會(huì)修改。

  • 由于搬家后地址發(fā)生變化,因此內(nèi)存“地址”也會(huì)有修改。

除了在切片的尾部追加,我們還可以在切片的開頭添加元素:

var a = []int{1,2,3} a = append([]int{0}, a...) // 在開頭添加1個(gè)元素 a = append([]int{-3,-2,-1}, a...) // 在開頭添加1個(gè)切片
登錄后復(fù)制

在切片開頭添加元素一般都會(huì)導(dǎo)致內(nèi)存的重新分配,而且會(huì)導(dǎo)致已有元素全部被復(fù)制 1 次,因此,從切片的開頭添加元素的性能要比從尾部追加元素的性能差很多。

因?yàn)?append 函數(shù)返回新切片的特性,所以切片也支持鏈?zhǔn)讲僮鳎覀兛梢詫⒍鄠€(gè) append 操作組合起來,實(shí)現(xiàn)在切片中間插入元素:

var a []int a = append(a[:i], append([]int{x}, a[i:]...)...) // 在第i個(gè)位置插入x a = append(a[:i], append([]int{1,2,3}, a[i:]...)...) // 在第i個(gè)位置插入切片
登錄后復(fù)制

每個(gè)添加操作中的第二個(gè) append 調(diào)用都會(huì)創(chuàng)建一個(gè)臨時(shí)切片,并將 a[i:] 的內(nèi)容復(fù)制到新創(chuàng)建的切片中,然后將臨時(shí)創(chuàng)建的切片再追加到 a[:i] 中。

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品国产亚洲av水果派| 国内精品久久久久久久亚洲| 尤物精品视频一区二区三区| 久久精品国产乱子伦| 久久精品国产99国产| 99热热久久这里只有精品166| 精品无码久久久久久久动漫| 日韩AV东京社区男人的天堂| 国产精品国产三级国产av中文| 欧美国产成人精品二区芒果视频| 国产精品三级在线| 思思久久精品在热线热| 国产精品婷婷午夜在线观看 | 精品人妻潮喷久久久又裸又黄| 精品丝袜国产自在线拍亚洲| 亚洲福利一区二区精品秒拍| 久久久久久夜精品精品免费啦| 无码日韩精品一区二区免费暖暖| 国产精品福利自产拍在线观看| 日韩一区精品视频一区二区| 久久精品国产男包| 精品无码无人网站免费视频| 99精品视频观看| 久久久精品2019免费观看| 久久精品蜜芽亚洲国产AV| 99这里只有精品66视频| 99久久精品免费精品国产| 99久久久国产精品免费牛牛四川| 久久久久亚洲精品影视| 亚洲国产精品久久久久婷婷软件| 久9re热这里精品首页| 午夜精品福利视频| 99久久国产综合精品1尤物| 精品偷自拍另类在线观看| 中文字幕亚洲综合精品一区| 竹菊影视国产精品| 伊人久久精品无码二区麻豆| 国内精品国产成人国产三级| 97在线精品视频| 亚洲欧洲国产精品香蕉网| 久久成人精品视频|