golang 數(shù)組和切片

數(shù)組類型的值(以下簡(jiǎn)稱數(shù)組)的長(zhǎng)度是固定的伶棒,而切片類型的值(以下簡(jiǎn)稱切片)是可變長(zhǎng)的吊趾。

?數(shù)組的長(zhǎng)度在聲明它的時(shí)候就必須給定,并且在之后不會(huì)再改變穆碎。可以說,數(shù)組的長(zhǎng)度是其類型的一部分宛渐。

golang數(shù)組的四種聲明方法
第一種

// var <數(shù)組名稱> [<數(shù)組長(zhǎng)度>]<數(shù)組元素>
var arra [2]int
arr[0]=1
arrp1[=2

第二種

// var <數(shù)組名稱> = [<數(shù)組長(zhǎng)度>]<數(shù)組元素>{元素1屁奏,元素2,...}
var arr = [2]int{1,2}
//或者
arr := [2]int{1,2}

第三種

// var <數(shù)組名稱>[<數(shù)組長(zhǎng)度>]<數(shù)組元素>=[...]<元素類型>{元素1色徘,元素2恭金,...}
var arr =[...]int{1,2}
//或者
arr :=[...]int {1,2}

第四種

// var <數(shù)組名稱>[<數(shù)組長(zhǎng)度>]<數(shù)組元素>=[...]<元素類型>{索引1:元素1,索引2:元素2,...}
var arr = [...]int{1:1,0:2}
// 或者
arr := [...]int{1:1,0:2}

?切片的長(zhǎng)度可以自動(dòng)地隨著其中元素?cái)?shù)量的增長(zhǎng)而增長(zhǎng)褂策,但不會(huì)隨著元素?cái)?shù)量的減少而減少横腿。

golang切片的3種聲明方法
①定義一個(gè)切片,然后讓切片去引用一個(gè)已經(jīng)創(chuàng)建好的數(shù)組

var arr [5]int = [...]int{1,2,3,4,5}
var slice = arr [1:3]

②通過make來創(chuàng)建切片

// var 切片名 []type = make([], len, [cap])辙培;參數(shù)說明:type是數(shù)據(jù)類型蔑水、len是大小、cap是切片容量(容量必須>=長(zhǎng)度)

通過make方式創(chuàng)建切片可以指定切片大小和容量
如果沒有給切片的各個(gè)元素賦值扬蕊,那么就會(huì)使用默認(rèn)值(int搀别、float=>0, strint=>"", bool=>false)
榮國(guó)make方式創(chuàng)建的切片對(duì)應(yīng)的數(shù)組是由make底層維護(hù),對(duì)外不可見尾抑,也就是只能通過slice訪問各個(gè)元素

 var slice []float64 = make([]float64, 5, 10)

③定義一個(gè)切片歇父,直接就指定具體數(shù)組,使用原理類似于make的方式

 var slice []string = []string{"zhangsan", "lisi", "wangwu"}

?我們其實(shí)可以把切片看做是對(duì)數(shù)組的一層簡(jiǎn)單的封裝再愈,因?yàn)樵诿總€(gè)切片的底層數(shù)據(jù)結(jié)構(gòu)中榜苫,一定會(huì)包含一個(gè)數(shù)組。后者可以被叫做前者的底層數(shù)組翎冲,而前者也可以被看作是對(duì)后者的某個(gè)連續(xù)片段的引用垂睬。

?也正因?yàn)槿绱耍珿o語(yǔ)言的切片類型屬于引用類型抗悍,同屬引用類型的還有后面會(huì)講到的字典類型驹饺、通道類型、函數(shù)類型等缴渊;而Go語(yǔ)言的數(shù)組類型則屬于值類型赏壹,同屬值類型的有基礎(chǔ)數(shù)據(jù)類型以及結(jié)構(gòu)體類型。

?注意衔沼,Go語(yǔ)言里不存在像java等編程語(yǔ)言中那種令人困惑的“傳值或傳引用”問題蝌借。在Go語(yǔ)言中昔瞧,我們判斷所謂的“傳值”或者“傳引用”只要看北傳遞的值的類型就好了。如果傳遞的值是引用類型的菩佑,那么就是“傳引用”自晰。如果傳遞的值是值類型的,那么就是“傳值”擎鸠。從傳遞成本的角度講缀磕,引用類型的值往往要比值類型的值低很多。

怎樣正確估算切片的長(zhǎng)度和容量劣光?

package main
import "fmt"
func main(){
    // 示例1
    s1 :=make([]int,5)
    fmt.println("The length of s1: %d\n",len(s1))
    fmt.println("The capacity of s1:%d\n",cap(s1))
    fmt.println("The value of s1: %d\n",s1)
    s2 := make([]int,5,8)
    fmt.println("The length of s2:%d\n",len(s2))
    fmt.println("The capacity of s2:%d\n",cap(s2))
    fmt.println("The value of s2: %d\n",s2)
}

首先袜蚕,內(nèi)建函數(shù)make聲明了一個(gè)[]int類型的變量s1。我傳給make函數(shù)的第二個(gè)參數(shù)是5绢涡,從而指明了該切片的長(zhǎng)度牲剃。再用幾乎相同的方式聲明了切片s2,只不過多傳了一個(gè)參數(shù)8以指明該切片的容量雄可。

切片s1和s2的容量分別是5和8凿傅。

原因:當(dāng)我們用make函數(shù)初始化切片時(shí),如果不指名其容量数苫,那么它就會(huì)和長(zhǎng)度一致聪舒。如果在初始化時(shí)指明了容量,那么切片的實(shí)際容量也就是它了虐急。這也正是s2的容量是8的原因箱残。


s3: = []int{1,2,3,4,5,6,7,8}
s4  := s3[3:6]

s4的長(zhǎng)度為3,容量為5

原因:由于s4是通過在s3上施加切片操作得來的止吁,所以s3的底層數(shù)組就是s4的底層數(shù)組被辑。又因?yàn)椋诘讓訑?shù)組不變的情況下敬惦,切片代表的窗口可以向右擴(kuò)展盼理,直至其底層數(shù)組的末尾。所以俄删,s4的容量就是其底層數(shù)組的長(zhǎng)度8減去上述切片表達(dá)式中的那個(gè)起始索引3宏怔,即5。

注意:切片帶邊的窗口是無法向左擴(kuò)展的也就是說畴椰,我們永遠(yuǎn)無法透過s4看到s4左邊的那3個(gè)元素臊诊。
最后,隨便提一下把切片的窗口向右擴(kuò)展到最大的方法迅矛。對(duì)于s4來說,切片表達(dá)式s4[0:cap(s4)]就可以做到潜叛。該表達(dá)式的結(jié)果(即一個(gè)新的切片)會(huì)是[]int{4,5,6,7,8}秽褒,其長(zhǎng)度和容量都是5壶硅。

知識(shí)擴(kuò)展

1.切片如何擴(kuò)容?

一旦一個(gè)切片無法容納更多的元素销斟,Go于洋就會(huì)想辦法擴(kuò)容庐椒。但它并不會(huì)改變?cè)瓉淼那衅巧梢粋€(gè)容量更大的切片蚂踊,然后將把原有元素和新元素一并拷貝到新切片中约谈。
在一般的情況下,你可以簡(jiǎn)單地認(rèn)為新切片的容量將是原切片容量的2倍犁钟。
但是棱诱,當(dāng)原切片的長(zhǎng)度大于或等于1024時(shí),Go語(yǔ)言會(huì)將以原容量的1.25倍作為新容量的基準(zhǔn)涝动。
新容量基準(zhǔn)會(huì)被調(diào)整(不斷與1.25相乘)迈勋,直到結(jié)果不小于原長(zhǎng)度與要追加的元素?cái)?shù)量之和(以下簡(jiǎn)稱新長(zhǎng)度)。最終醋粟,新容量往往會(huì)比新長(zhǎng)度要大一些靡菇,當(dāng)然,相等也是可能得米愿。

2.切片的底層數(shù)組什么時(shí)候會(huì)被替換厦凤?
確切地說,一個(gè)切片的底層數(shù)組永遠(yuǎn)不會(huì)被替換育苟。雖然在擴(kuò)容的時(shí)候Go語(yǔ)言一定會(huì)生成新的底層數(shù)組较鼓,但是它同時(shí)生成了新的切片。它是把新的切片作為了新底層數(shù)組的窗口宙搬,而沒有對(duì)原切片及其底層數(shù)組做任何改動(dòng)笨腥。

在無須擴(kuò)容時(shí),append函數(shù)返回的是指向原底層數(shù)組的切片勇垛,而在需要擴(kuò)容時(shí)脖母,append函數(shù)返回的是指向新底層數(shù)組的新切片。

所以闲孤,嚴(yán)格來說谆级,“擴(kuò)容”這個(gè)詞用來這里雖然形象但并不適合。

順便說一下讼积,只要新長(zhǎng)度不會(huì)超過切片的原容量肥照,那么使用append函數(shù)對(duì)其追加元素的時(shí)候就不會(huì)引起擴(kuò)容。這只會(huì)使緊鄰切片窗口右邊的(底層數(shù)組中的)元素被替換成新的元素勤众。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舆绎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子们颜,更是在濱河造成了極大的恐慌吕朵,老刑警劉巖猎醇,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異努溃,居然都是意外死亡硫嘶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門梧税,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沦疾,“玉大人,你說我怎么就攤上這事第队∠” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵斥铺,是天一觀的道長(zhǎng)彻桃。 經(jīng)常有香客問我,道長(zhǎng)晾蜘,這世上最難降的妖魔是什么邻眷? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮剔交,結(jié)果婚禮上肆饶,老公的妹妹穿的比我還像新娘。我一直安慰自己岖常,他們只是感情好驯镊,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著竭鞍,像睡著了一般板惑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上偎快,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天冯乘,我揣著相機(jī)與錄音,去河邊找鬼晒夹。 笑死裆馒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丐怯。 我是一名探鬼主播喷好,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼读跷!你這毒婦竟也來了梗搅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎无切,沒想到半個(gè)月后蟀俊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡订雾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矛洞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洼哎。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖沼本,靈堂內(nèi)的尸體忽然破棺而出噩峦,到底是詐尸還是另有隱情,我是刑警寧澤抽兆,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布识补,位于F島的核電站,受9級(jí)特大地震影響辫红,放射性物質(zhì)發(fā)生泄漏凭涂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一贴妻、第九天 我趴在偏房一處隱蔽的房頂上張望切油。 院中可真熱鬧,春花似錦名惩、人聲如沸澎胡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)攻谁。三九已至,卻和暖如春弯予,著一層夾襖步出監(jiān)牢的瞬間戚宦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工熙涤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阁苞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓祠挫,卻偏偏與公主長(zhǎng)得像那槽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子等舔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 數(shù)組 數(shù)組在go語(yǔ)言中為值類型 數(shù)組之間可以用= =或!=比較,但是數(shù)組長(zhǎng)度也是類型的一部分,因此不同長(zhǎng)度的數(shù)組為...
    Link_Biao閱讀 7,428評(píng)論 0 0
  • 線性結(jié)構(gòu)是計(jì)算機(jī)最常用的數(shù)據(jù)結(jié)構(gòu)之一骚灸。無論是數(shù)組(arrary)還是鏈表(list),在編程中不可或缺慌植。golan...
    _二少爺閱讀 6,599評(píng)論 5 13
  • 數(shù)組Go語(yǔ)言中的數(shù)組是定長(zhǎng)的同一類型數(shù)據(jù)的集合甚牲,數(shù)組索引是從0開始的义郑。數(shù)組有以下幾種創(chuàng)建方式 以下是一些特殊數(shù)組 ...
    小杰的快樂時(shí)光閱讀 1,680評(píng)論 0 0
  • 一拖二的日子讓我這個(gè)平時(shí)不做飯的媽媽倒沒覺得在生活中有多大考驗(yàn),我做得簡(jiǎn)單也好丈钙,出去吃也好非驮,孩子們都很配合。大寶從...
    喻青閱讀 670評(píng)論 0 0
  • 人生有三樣?xùn)|西一去不返:時(shí)間雏赦、言辭和機(jī)會(huì)劫笙;三樣?xùn)|西足以毀掉一個(gè)人:怒火、驕傲和不寬诵歉凇填大;三樣?xùn)|西永不應(yīng)放棄:平和、誠(chéng)...
    xcy無名閱讀 309評(píng)論 0 0