Go 語(yǔ)言切片

2021-10-27

切片(slice)是對(duì)數(shù)組的一個(gè)連續(xù)片段的引用毅往,所以切片是一個(gè)引用類型檩淋,這個(gè)片段可以是整個(gè)數(shù)組芬为,也可以是一個(gè)片段,數(shù)組中的子集蟀悦,需要注意的是媚朦,終止索引標(biāo)識(shí)的項(xiàng)不包括在切片內(nèi)。

一個(gè)slice由三個(gè)部分構(gòu)成:指針日戈、長(zhǎng)度和容量询张。slice的語(yǔ)法和數(shù)組很像,只是沒有固定長(zhǎng)度浙炼。指針指向第一個(gè)slice元素對(duì)應(yīng)的底層數(shù)組元素的地址瑞侮,要注意的是slice的第一個(gè)元素并不一定就是數(shù)組的第一個(gè)元素的圆。長(zhǎng)度對(duì)應(yīng)slice中元素的數(shù)目;

指針:開始切片的位置

長(zhǎng)度:指針到結(jié)束的位置

容量:相當(dāng)于袋子半火,能裝多少越妈,長(zhǎng)度不能大于容量

內(nèi)置的len和cap函數(shù)分別返回slice的長(zhǎng)度和容量。

從數(shù)組或切片中生成新的切片

格式

slice [start:end]

語(yǔ)法:

  • slice :切片的對(duì)象
  • start:開始切片的索引
  • end:結(jié)束切片的索引

例如:

package main

import "fmt"

func main()  {
    var array = [10]int{3,2,4,5,76,8,2,4,28,24}
    fmt.Println(array,array[2:8])

}

切片

從圖中可以看到對(duì)比結(jié)果钮糖,切片的開始是從索引為2的數(shù)開始到索引為7的結(jié)束梅掠,而切片中索引8是不包括在內(nèi)的。

start缺省

end缺省

兩邊同時(shí)缺省

總結(jié)特性:

  • 取出的元素?cái)?shù)量為:start - ned店归;
  • 取出元素不包含結(jié)束位置對(duì)應(yīng)的索引阎抒,切片最后一個(gè)元素使用 slice[len(slice)] 獲取消痛;
  • 當(dāng)缺省開始位置時(shí)且叁,表示從連續(xù)區(qū)域開頭到結(jié)束位置;
  • 當(dāng)缺省結(jié)束位置時(shí)秩伞,表示從開始位置到整個(gè)連續(xù)區(qū)域末尾逞带;
  • 兩者同時(shí)缺省時(shí),與切片本身等效纱新;
  • 兩者同時(shí)為 0 時(shí)展氓,等效于空切片,一般用于切片復(fù)位脸爱。

根據(jù)索引位置取切片 slice 元素值時(shí)遇汞,取值范圍是(0~len(slice)-1),超界會(huì)報(bào)運(yùn)行時(shí)錯(cuò)誤簿废,生成切片時(shí)空入,結(jié)束位置可以填寫 len(slice) 但不會(huì)報(bào)錯(cuò)。

從指定范圍中生成切片
func slice2()  {
    var hight [50]int

    for i:=0;i<50;i++ {
        hight[i]=i
    }

    fmt.Println(hight[15:35])  //區(qū)間
    fmt.Println(hight[25:35])   //中間
    fmt.Println(hight[:20])     //從開頭到中間指定的所有元素
}
image.png

直接聲明新的切片

聲明格式

 var slice []type

其中slice切片的名族檬,type切片的元素類型

 package main
 
 import "fmt"
 
 func main()  {
  slice_name()
 
 }
 
 func slice_name()  {
  // 聲明字符串切片
  var strList []string
  // 聲明整型切片
  var numList []int
  // 聲明一個(gè)空切片
  var numListEmpty = []int{}
  // 輸出3個(gè)切片
  fmt.Println(strList, numList, numListEmpty)
  // 輸出3個(gè)切片大小
  fmt.Println(len(strList), len(numList), len(numListEmpty))
  // 切片判定空的結(jié)果
  fmt.Println(strList == nil)
  fmt.Println(numList == nil)
  fmt.Println(numListEmpty == nil)
 
 }
image.png

第一個(gè)和第二個(gè)切片默認(rèn)的的元素值為nil执庐,而第三個(gè)切片本來會(huì)在{}中填充切片的初始化元素,這里沒有填充导梆,所以切片是空的轨淌,但是此時(shí)的 numListEmpty 已經(jīng)被分配了內(nèi)存,只是還沒有元素看尼。

再最后的跟nil的判定中第三個(gè)切片為false递鹉,

切片是動(dòng)態(tài)結(jié)構(gòu),即沒有固定的長(zhǎng)度藏斩。只能與 nil 判定相等躏结,不能互相判定相等。聲明新的切片后狰域,可以使用 append() 函數(shù)向切片中添加元素媳拴。

使用make()函數(shù)構(gòu)造切片

格式

 make([]type,size,cap)

type:切片中元素的類型

size:切片的長(zhǎng)度

cap:預(yù)分配的元素個(gè)數(shù)

 package main
 
 import "fmt"
 
 func main()  {
  make_slice()
 
 }
 
 func make_slice()  {
  a := make([]int, 2)
  b := make([]int, 2, 10)
  fmt.Println(a, b)
  fmt.Println(len(a), len(b))
 }
image.png

b預(yù)分配了10個(gè)元素黄橘,但是size為2所以和a的len()值是一樣的

容量不會(huì)影響當(dāng)前的元素個(gè)數(shù),因此 a 和 b 取 len 都是 2屈溉。

溫馨提示

使用 make() 函數(shù)生成的切片一定發(fā)生了內(nèi)存分配操作塞关,但給定開始與結(jié)束位置(包括切片復(fù)位)的切片只是將新的切片結(jié)構(gòu)指向已經(jīng)分配好的內(nèi)存區(qū)域,設(shè)定開始與結(jié)束位置子巾,不會(huì)發(fā)生內(nèi)存分配操作帆赢。

學(xué)習(xí)地址:http://c.biancheng.net/view/27.html

append()添加元素

內(nèi)建函數(shù)append() ,動(dòng)態(tài)添加元素

用法

slice = append(slice,23)  //追加單個(gè)元素
slice = append(slice,23,7,1,3) //追加多個(gè)元素
slice = append([]int{0},slice...) //在切片開頭加入元素,需要解包即加入...
slice = append(slice,[]int{6,7,8}...) //追加一個(gè)切片线梗,切片需要解包
slice = append([]int{6,7,8},slice...)  //在原有切片開頭加入切片

例子:

package main

import "fmt"

func main()  {
    create_slice()

}

func create_slice()  {
    var slice = []int{1,2,3,4}
    slice = append(slice,23)    //在原有的切片基礎(chǔ)上添加上23元素
    fmt.Println(slice)
    fmt.Println(len(slice))
}

使用append()函數(shù)為動(dòng)態(tài)切片添加元素時(shí)椰于,如果容量不足,切片會(huì)自動(dòng)進(jìn)行"擴(kuò)容"仪搔,長(zhǎng)度就會(huì)發(fā)生變化瘾婿。

切片在擴(kuò)容的時(shí)候,容量擴(kuò)展規(guī)律時(shí)按容量的 2 倍數(shù)進(jìn)行擴(kuò)充


image.png

可以看到長(zhǎng)度和容量并不相等烤咧,容量相當(dāng)于袋子偏陪,而長(zhǎng)度就是錢,錢多了袋子也要換大的了髓削,為了防盜,位置也要發(fā)生變化了镀娶。

中間切片立膛,鏈?zhǔn)讲僮?/p>

var slice[]int{1,2,3,4}
slice = append(slice[:i], append([]int{x}, slice[i:]...)...) // 在第i個(gè)位置插入x
slice = append(slice[:i], append([]int{54,51,56}, slice[i:]...)...) // 在第i個(gè)位置插入切片

源碼

package main

import "fmt"

func main()  {
    Sliceinsert()

}

func Sliceinsert()  {
    var slice = []int{1,2,3,4}
    slice = append(slice[:2], append([]int{666}, slice[2:]...)...) // 在第i個(gè)位置插入x
    slice = append(slice[:3], append([]int{54,51,56}, slice[3:]...)...) // 在第i個(gè)位置插入切片
    fmt.Printf("長(zhǎng)度:%d,元素:%d\n",len(slice),slice)
}


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梯码,一起剝皮案震驚了整個(gè)濱河市宝泵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌轩娶,老刑警劉巖儿奶,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鳄抒,居然都是意外死亡闯捎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門许溅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓤鼻,“玉大人,你說我怎么就攤上這事贤重〔绲唬” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵并蝗,是天一觀的道長(zhǎng)祭犯。 經(jīng)常有香客問我秸妥,道長(zhǎng),這世上最難降的妖魔是什么沃粗? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任粥惧,我火速辦了婚禮,結(jié)果婚禮上陪每,老公的妹妹穿的比我還像新娘影晓。我一直安慰自己,他們只是感情好檩禾,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布挂签。 她就那樣靜靜地躺著,像睡著了一般盼产。 火紅的嫁衣襯著肌膚如雪饵婆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天戏售,我揣著相機(jī)與錄音侨核,去河邊找鬼。 笑死灌灾,一個(gè)胖子當(dāng)著我的面吹牛搓译,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锋喜,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼些己,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了嘿般?” 一聲冷哼從身側(cè)響起段标,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炉奴,沒想到半個(gè)月后逼庞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瞻赶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年赛糟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砸逊。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虑灰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出痹兜,到底是詐尸還是另有隱情穆咐,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站对湃,受9級(jí)特大地震影響崖叫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拍柒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一心傀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拆讯,春花似錦脂男、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至爽室,卻和暖如春汁讼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阔墩。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工嘿架, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人啸箫。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓耸彪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親忘苛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蝉娜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 1. 關(guān)于切片的概述 切片slice是一個(gè)可變長(zhǎng)度的序列,切片中的每個(gè)元素都是相同類型,我們可以將切片看做動(dòng)態(tài)數(shù)組...
    楚江云閱讀 554評(píng)論 0 0
  • 一、Go語(yǔ)言中切片類型出現(xiàn)的原因 切片是一種數(shù)據(jù)類型柑土,這種數(shù)據(jù)類型便于使用和管理數(shù)據(jù)集合蜀肘。創(chuàng)建一個(gè)100萬(wàn)個(gè)int...
    碼墨閱讀 1,794評(píng)論 0 1
  • // //Go語(yǔ)言切片 // /* // go語(yǔ)言切片是對(duì)數(shù)組的抽象 // Go 數(shù)組的長(zhǎng)度不可改變绊汹,在特定場(chǎng)景中...
    JackieZhang閱讀 848評(píng)論 0 0
  • Go 語(yǔ)言切片是對(duì)數(shù)組的抽象稽屏。 Go 數(shù)組的長(zhǎng)度不可改變,在特定場(chǎng)景中這樣的集合就不太適用西乖,Go中提供了一種靈活狐榔,...
    醉傾城1閱讀 174評(píng)論 0 1
  • Go 語(yǔ)言的切片(示例代碼) Slice 是一個(gè)通過指向數(shù)組底層,來進(jìn)行變長(zhǎng)數(shù)組的實(shí)現(xiàn)获雕。 定義切片的格式:var ...
    hvkcoder閱讀 251評(píng)論 0 2