日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)GO教程:Go語言append()為切片添加元素

Go語言的內(nèi)建函數(shù) append() 可以為切片動態(tài)添加元素,代碼如下所示:

10年積累的網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有隆德免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

var a []int
a = append(a, 1) // 追加1個元素
a = append(a, 1, 2, 3) // 追加多個元素, 手寫解包方式
a = append(a, []int{1,2,3}...) // 追加一個切片, 切片需要解包

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

切片在擴容時,容量的擴展規(guī)律是按容量的 2 倍數(shù)進行擴充,例如 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: %p\n", len(numbers), cap(numbers), numbers)
}

代碼輸出如下:

len: 1  cap: 1 pointer: 0xc0420080e8
len: 2  cap: 2 pointer: 0xc042008150
len: 3  cap: 4 pointer: 0xc04200e320
len: 4  cap: 4 pointer: 0xc04200e320
len: 5  cap: 8 pointer: 0xc04200c200
len: 6  cap: 8 pointer: 0xc04200c200
len: 7  cap: 8 pointer: 0xc04200c200
len: 8  cap: 8 pointer: 0xc04200c200
len: 9  cap: 16 pointer: 0xc042074000
len: 10  cap: 16 pointer: 0xc042074000

代碼說明如下:

  • 第 1 行,聲明一個整型切片。
  • 第 4 行,循環(huán)向 numbers 切片中添加 10 個數(shù)。
  • 第 5 行,打印輸出切片的長度、容量和指針變化,使用函數(shù) len() 查看切片擁有的元素個數(shù),使用函數(shù) cap() 查看切片的容量情況。

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

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

  • 員工和工位就是切片中的元素。
  • 辦公地就是分配好的內(nèi)存。
  • 搬家就是重新分配內(nèi)存。
  • 無論搬多少次家,公司名稱始終不會變,代表外部使用切片的變量名不會修改。
  • 由于搬家后地址發(fā)生變化,因此內(nèi)存“地址”也會有修改。

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

var a = []int{1,2,3}
a = append([]int{0}, a...) // 在開頭添加1個元素
a = append([]int{-3,-2,-1}, a...) // 在開頭添加1個切片

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

因為 append 函數(shù)返回新切片的特性,所以切片也支持鏈式操作,我們可以將多個 append 操作組合起來,實現(xiàn)在切片中間插入元素:

var a []int
a = append(a[:i], append([]int{x}, a[i:]...)...) // 在第i個位置插入x
a = append(a[:i], append([]int{1,2,3}, a[i:]...)...) // 在第i個位置插入切片

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


文章標題:創(chuàng)新互聯(lián)GO教程:Go語言append()為切片添加元素
本文URL:http://www.5511xx.com/article/dhjsoge.html