C語言中文網 目錄
首頁 > Go語言教程 > Go語言容器 閱讀:7,096

Go語言append()為切片添加元素

< 上一頁Go語言切片 Go語言切片復制下一頁 >

Go 語言的內建函數 append() 可以為切片動態添加元素。每個切片會指向一片內存空間,這片空間能容納一定數量的元素。當空間不能容納足夠多的元素時,切片就會進行“擴容”。“擴容”操作往往發生在 append() 函數調用時。

切片在擴容時,容量的擴展規律按容量的 2 倍數擴充,例如 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 行,循環向 numbers 切片添加10個數。
  • 第 5 行中,打印輸出切片的長度、容量和指針變化。使用 len() 函數查看切片擁有的元素個數,使用 cap() 函數查看切片的容量情況。

通過查看代碼輸出,有一個有意思的規律:len() 函數并不等于 cap。

往一個切片中不斷添加元素的過程,類似于公司搬家。公司發展初期,資金緊張,人員很少,所以只需要很小的房間即可容納所有的員工。隨著業務的拓展和收入的增加就需要擴充工位,但是辦公地的大小是固定的,無法改變。因此公司選擇搬家,每次搬家就需要將所有的人員轉移到新的辦公點。
  • 員工和工位就是切片中的元素。
  • 辦公地就是分配好的內存。
  • 搬家就是重新分配內存。
  • 無論搬多少次家,公司名稱始終不會變,代表外部使用切片的變量名不會修改。
  • 因為搬家后地址發生變化,因此內存“地址”也會有修改。

append() 函數除了添加一個元素外,也可以一次性添加很多元素。
var car []string
       
// 添加1個元素       
car = append(car, "OldDriver")
       
// 添加多個元素
car = append(car, "Ice", "Sniper", "Monk")

// 添加切片
team := []string{"Pig", "Flyingcake", "Chicken"}
car = append(car, team...)

fmt.Println(car)
代碼輸出如下:
[OldDriver Ice Sniper Monk Pig Flyingcake Chicken]

代碼說明如下:
  • 第 1 行,聲明一個字符串切片。
  • 第 4 行,往切片中添加一個元素。
  • 第 7 行,使用 append() 函數向切片中添加多個元素。
  • 第 10 行,聲明另外一個字符串切片
  • 第 11 行,在team后面加上了...,表示將 team 整個添加到 car 的后面。
< 上一頁Go語言切片 Go語言切片復制下一頁 >

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo