Golang筆記(一):數(shù)組與切片

數(shù)組

  • 創(chuàng)建方式:
    以創(chuàng)建 int 類(lèi)型數(shù)組為例
var array1 [3]int // 元素會(huì)被自動(dòng)初始化為0值 => {0, 0, 0}
array2 := [3]int{1} // 位提供初始化的元素被初始化為零值 => {1, 0, 0}
arary3 := [3]int{1, 2: 3} // 指定索引2的元素初始化值為3 => {1, 0, 3}
array4 := [...]int{1, 2, 3} // 不直接指定長(zhǎng)度冤竹,編譯器會(huì)根據(jù)元素個(gè)數(shù)給定長(zhǎng)度 => {1, 2, 3}
array5 := [...]int{1, 2: 3} // 指定索引 2 的元素初始化值為3土至,會(huì)影響該數(shù)組長(zhǎng)度 => {1, 0, 3}
  • 復(fù)合型數(shù)組:
    復(fù)合型數(shù)組可以省略類(lèi)型化標(biāo)簽
type Student struct {
    name string 
    age    int 
}
studentArray := [...]Student {
    {"studentA", 18}, // 省略結(jié)構(gòu)體標(biāo)簽
    {"studentB", 20}
}
  • 多維數(shù)組
    注意: 1. 多維數(shù)組僅允許第一維使用 ...
    2. 內(nèi)置函數(shù) len 和 cap 都只返回第一維數(shù)組的長(zhǎng)度

  • 比較
    如果元素支持 == 比較宦焦,那么該數(shù)組也支持此操作

切片

切片本身是個(gè)只讀對(duì)象展东,其工作機(jī)制累死數(shù)組指針的一種包裝沃饶。可以基于數(shù)組或數(shù)組指針創(chuàng)建切片似踱,以開(kāi)始和結(jié)束索引位置確定引用的數(shù)組片段捍靠。不支持反向索引,世紀(jì)范圍是一個(gè)右半開(kāi)區(qū)間衅金。屬性 cap 表示切片所引用數(shù)組片段的真是長(zhǎng)度噪伊,len 用于限定可讀的寫(xiě)元素?cái)?shù)量。另外氮唯,數(shù)組必須 addressable鉴吹,否則會(huì)引發(fā)錯(cuò)誤。
與數(shù)組區(qū)別:

  1. 切片創(chuàng)建不需要提前聲明長(zhǎng)度惩琉;而數(shù)組需要聲明豆励,操作數(shù)組索引大于該數(shù)組長(zhǎng)度,會(huì)產(chǎn)生越界的異常瞒渠。
  2. 切片可以通過(guò) make([]int, 3, 5) 方式創(chuàng)建良蒸,第一個(gè)參數(shù)為類(lèi)型,第二個(gè)參數(shù)為長(zhǎng)度(len)伍玖,第三個(gè)參數(shù)為容量(cap)
  3. 切片的長(zhǎng)度(len)和 容量(cap)兩個(gè)屬性不一定相等嫩痰;而數(shù)組的兩個(gè)屬性一定相等。切片底層是數(shù)組的一部分或者全部窍箍, cap 值為從切片引用該底層數(shù)組開(kāi)頭部分到該底層數(shù)組結(jié)尾的長(zhǎng)度串纺,而 len 值為該切片引用的底層數(shù)組部分的長(zhǎng)度。
  4. 切片是引用類(lèi)型仔燕,而數(shù)組是值類(lèi)型造垛。說(shuō)白了就是切片傳遞的是引用,只要對(duì)任意一個(gè)地方修改原切片值也會(huì)改變晰搀;而數(shù)組是值類(lèi)型五辽,每次傳遞相當(dāng)于重新分配內(nèi)存創(chuàng)建了一個(gè)新的數(shù)組,各個(gè)之間相互獨(dú)立不影響外恕。
  5. 切片不支持比較操作杆逗,即使元素類(lèi)型支持也不行乡翅,僅可以判斷您是否是 nil
  • 創(chuàng)建方式:
sliceA := make([]int, 2, 5)  // len = 2 cap = 5 => {0, 0}
sliceB := make([]int2, 2]) // len = 2 cap = 5 => {0, 0}
sliceC := []int{1, 2, 3, 5: 30} // len = 6 cap = 6 => {1, 2, 3, 0, 0, 30}

注意:
下面兩種聲明方式,前者只是定義了一個(gè) []int 類(lèi)型變量罪郊,并未執(zhí)行初始化操作蠕蚜;而后者則用初始化表達(dá)式完成了全部創(chuàng)建過(guò)程。

var sliceA []int // sliceA == nil true
sliceB := []int{} // sliceB == nil false
  • 優(yōu)勢(shì)
  1. 很顯然悔橄,切片只是很小的結(jié)構(gòu)體對(duì)象靶累,用來(lái)代替數(shù)組傳參可以避免復(fù)制開(kāi)銷(xiāo)
  2. make 函數(shù)允許在運(yùn)行期動(dòng)態(tài)制定數(shù)組長(zhǎng)度,繞開(kāi)了數(shù)組類(lèi)型必須使用編譯期常量的限制癣疟。

然而挣柬,并非所有時(shí)候都適合使用切片代替數(shù)組,因?yàn)榍衅讓訑?shù)組可能會(huì)在堆上分配內(nèi)存睛挚, 而且小數(shù)組在棧上拷貝的消耗也未必就比 make 代價(jià)大邪蛔。

  • append
    向切片尾部添加數(shù)據(jù)(slice[len]),返回新的切片對(duì)象(如果超過(guò) cap 限制扎狱,則為心切片獨(dú)享重新分配內(nèi)存和數(shù)組侧到,所以要返回新的切片對(duì)象)。向 nil 切片追加數(shù)據(jù)時(shí)淤击,會(huì)為其分配底層數(shù)組內(nèi)存匠抗。
slice := make([]int, 0, 5) // {}
sliceA := append(slice, 10) // {10,}
sliceB := append(sliceB, 20, 30) // {10, 20, 30}
sliceC := append(sliceB, 100, 200, 300) // {10, 20, 30, 100, 200, 300} => 超出 cap, 新切片的地址已經(jīng)變了

注意:

  • 是超出切片 cap 限制,而非超出底層數(shù)組長(zhǎng)度限制遭贸,因?yàn)?cap 可小于數(shù)組長(zhǎng)度戈咳。
  • 新分配數(shù)組長(zhǎng)度是原 cap 的 2 倍,而非原數(shù)組的 2 倍(并非總是 2 倍壕吹,對(duì)于較大的切片著蛙,會(huì)嘗試擴(kuò)容 1/4,以節(jié)約內(nèi)存)
  • 因?yàn)榇嬖谥匦路峙涞讓訑?shù)組的緣故耳贬,建議預(yù)留足夠空間踏堡,避免多次分配復(fù)制的內(nèi)存開(kāi)銷(xiāo)
  • copy
    在兩個(gè)切片對(duì)象間復(fù)制數(shù)據(jù),允許指向同一底層數(shù)組咒劲,允許目標(biāo)區(qū)間重疊顷蟆。最終所復(fù)制長(zhǎng)度以較短的切片長(zhǎng)度(len)為準(zhǔn)。
slice := []int{1, 2, 3, 4, 5}
sliceA := slice[:] // {1, 2, 3, 4, 5}
sliceB := slice[1:3] // {2, 3}
n:= copy(sliceA, sliceB) //sliceA:{2 3 3 4 5} sliceB:{3, 3} n: 2

注意

  • 如果切片長(zhǎng)時(shí)間引用大數(shù)組中很小的片段腐魂,建議新建獨(dú)立切片帐偎,復(fù)制出所需數(shù)據(jù),以便于原數(shù)組內(nèi)存被及時(shí)回收蛔屹。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末削樊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漫贞,老刑警劉巖甸箱,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異迅脐,居然都是意外死亡芍殖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)谴蔑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)豌骏,“玉大人,你說(shuō)我怎么就攤上這事树碱】鲜剩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵成榜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蹦玫,道長(zhǎng)赎婚,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任樱溉,我火速辦了婚禮挣输,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘福贞。我一直安慰自己撩嚼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布挖帘。 她就那樣靜靜地躺著完丽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拇舀。 梳的紋絲不亂的頭發(fā)上逻族,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音骄崩,去河邊找鬼聘鳞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛要拂,可吹牛的內(nèi)容都是我干的抠璃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼脱惰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搏嗡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起枪芒,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤彻况,失蹤者是張志新(化名)和其女友劉穎谁尸,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體纽甘,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡良蛮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悍赢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片决瞳。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖左权,靈堂內(nèi)的尸體忽然破棺而出皮胡,到底是詐尸還是另有隱情,我是刑警寧澤赏迟,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布屡贺,位于F島的核電站,受9級(jí)特大地震影響锌杀,放射性物質(zhì)發(fā)生泄漏甩栈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一糕再、第九天 我趴在偏房一處隱蔽的房頂上張望量没。 院中可真熱鬧,春花似錦突想、人聲如沸殴蹄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)袭灯。三九已至,卻和暖如春垒探,著一層夾襖步出監(jiān)牢的瞬間妓蛮,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工圾叼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛤克,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓夷蚊,卻偏偏與公主長(zhǎng)得像构挤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惕鼓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • 出處---Go編程語(yǔ)言 歡迎來(lái)到 Go 編程語(yǔ)言指南筋现。本指南涵蓋了該語(yǔ)言的大部分重要特性 Go 語(yǔ)言的交互式簡(jiǎn)介,...
    Tuberose閱讀 18,399評(píng)論 1 46
  • 切片是 Go 中的一種基本的數(shù)據(jù)結(jié)構(gòu),使用這種結(jié)構(gòu)可以用來(lái)管理數(shù)據(jù)集合矾飞。切片的設(shè)計(jì)想法是由動(dòng)態(tài)數(shù)組概念而來(lái)一膨,為了開(kāi)...
    一縷殤流化隱半邊冰霜閱讀 11,226評(píng)論 21 55
  • 跌跌絆絆一路遇人幾許多,曾有暖心掛牽挺過(guò)我的貴人洒沦,雖未有過(guò)多來(lái)往豹绪,相處,也沒(méi)回報(bào)過(guò)什么申眼,心中仍不甚感激瞒津,此生大抵都...
    瑾_年閱讀 349評(píng)論 0 0
  • 這世上有些人一輩子都遇不到緣分
    高小杉閱讀 164評(píng)論 0 1
  • by——看了《狼少年》成為宋仲基腦殘粉的宋仲基腦...
    74605344dab8閱讀 502評(píng)論 0 0