Go語言append切片添加元素的實(shí)現(xiàn)
Go語言的內(nèi)建函數(shù) append() 可以為切片動(dòng)態(tài)添加元素,代碼如下所示:
var a []int a = append(a, 1) // 追加1個(gè)元素 a = append(a, 1, 2, 3) // 追加多個(gè)元素, 手寫解包方式 a = append(a, []int{1,2,3}...) // 追加一個(gè)切片, 切片需要解包
不過需要注意的是,在使用 append() 函數(shù)為切片動(dòng)態(tài)添加元素時(shí),如果空間不足以容納足夠多的元素,切片就會(huì)進(jìn)行“擴(kuò)容”,此時(shí)新切片的長(zhǎng)度會(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: %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 行,聲明一個(gè)整型切片。
- 第 4 行,循環(huán)向 numbers 切片中添加 10 個(gè)數(shù)。
- 第 5 行,打印輸出切片的長(zhǎng)度、容量和指針變化,使用函數(shù) len() 查看切片擁有的元素個(gè)數(shù),使用函數(shù) cap() 查看切片的容量情況。
通過查看代碼輸出,可以發(fā)現(xiàn)一個(gè)有意思的規(guī)律:切片長(zhǎng)度 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è)切片
在切片開頭添加元素一般都會(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è)位置插入切片
每個(gè)添加操作中的第二個(gè) append 調(diào)用都會(huì)創(chuàng)建一個(gè)臨時(shí)切片,并將 a[i:] 的內(nèi)容復(fù)制到新創(chuàng)建的切片中,然后將臨時(shí)創(chuàng)建的切片再追加到 a[:i] 中。
到此這篇關(guān)于Go語言append切片添加元素的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Go語言append切片添加元素內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言切片前或中間插入項(xiàng)與內(nèi)置copy()函數(shù)詳解
這篇文章主要介紹了Go語言切片前或中間插入項(xiàng)與內(nèi)置copy()函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04go語言實(shí)現(xiàn)通過FTP庫自動(dòng)上傳web日志
這篇文章主要介紹了go語言實(shí)現(xiàn)通過FTP庫自動(dòng)上傳web日志,非常簡(jiǎn)單實(shí)用,需要的小伙伴快來參考下吧。2015-03-03Golang空結(jié)構(gòu)體struct{}用途,你知道嗎
這篇文章主要介紹了Golang空結(jié)構(gòu)體struct{}用途,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01golang打包成帶圖標(biāo)的exe可執(zhí)行文件
這篇文章主要給大家介紹了關(guān)于golang打包成帶圖標(biāo)的exe可執(zhí)行文件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-06-06Go語言基礎(chǔ)設(shè)計(jì)模式之策略模式示例詳解
這篇文章主要為大家介紹了Go語言基礎(chǔ)設(shè)計(jì)模式之策略模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11