Go學習--切片

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?切片

切片定義:

切片(slice)是對數(shù)組一個連續(xù)片段的引用认境,所以切片是一個引用類型。

注意事項:

切片的長度可以在運行時修改挟鸠,最小為0叉信,最大為相關數(shù)組的長度:切片是一個長度可變的數(shù)組。

切片容量:

cap()

切片聲明:

var slice []type (不需要說明長度)

切片初始化:

arr := [5]int{1, 2, 3, 4, 5} ? //數(shù)組

var sl []int = arr[0:3] ? ?//var sl []int = arr[:]等于完整的arr數(shù)組

or:

sl := []int{1, 2, 3, 4, 5} ?//聲明并初始化了一個切片

切片的組成:

指針艘希、長度(len)硼身、容量(cap)

指針:指向第一個slice元素對應的底層數(shù)組元素的內存地址。注:slice的第一個元素不一定就是數(shù)組的第一個元素覆享。

用make()創(chuàng)建一個切片:

slice := make([]type, len, [cap])

ep:

sl := make([]int, 50, 100) ?等價于 sl := new([100]int)[0:50]

new()和make()的區(qū)別:

new(T):為每個新的類型T分配一片內存佳遂,初始化為0并且返回類型為*T的內存地址:這種方法返回一個指向類型為T,值為0的地址的指針(適用:值類型和結構體)

make(T):返回一個類型為T的初始值(適用:切片淹真、map和channel)

ep:

arr := new([10]int)? //&[0 0 0 0 0]

arr2 := make([]int, 5)? //[0 0 0 0 0]


切片重組:

sl:=make([]type, start_length, capacity)

改變切片長度(start_length)的過程稱之為切片重組reslicing

方法:sl = sl[0:len(sl)+1]

切片可以反復擴展直到占據(jù)整個相關數(shù)組讶迁,如果到len(sl)+1 > capacity則會報錯:panic: runtime error: slice bounds out of range


切片的復制:

sl_form := []int{1,2,3}

sl_to := make([]int, 10)

new := copy(sl_to, sl_from)? //[1 2 3 0 0 0 0 0 0 0]

coyp函數(shù):第一個參數(shù):to,第二個參數(shù):from核蘸, 返回:拷貝的個數(shù)巍糯。 copy操作流程:把from切片的元素從第一個開始一個一個的拷貝到,to切片里面(to切片也是從第一個元素開始接受的)客扎,如果想向一個切片增加一個元素或者一個切片祟峦,則需要用到append函數(shù)。

切片的追加:

append函數(shù): 第一個參數(shù):被追加的切片徙鱼;第二個參數(shù):需要追加的數(shù)據(jù)宅楞;返回:被追加后新的切片

注意: append 在大多數(shù)情況下很好用,但是如果你想完全掌控整個追加過程袱吆,你可以實現(xiàn)一個這樣的 AppendByte 方法:

funcAppendByte(slice[]byte,data ...byte) []byte{

? ? ? ? m :=len(slice)

? ? ? ? n := m +len(data)

? ? ? ? if n >cap(slice) {

? ? ? ? // if necessary, reallocate

? ? ? ? // allocate double what's needed, for future growth.

? ? ? ? newSlice :=make([]byte,(n +1) *2)

? ? ? ? copy(newSlice,slice)

? ? ? ? slice= newSlice

? ? }

? ? slice=slice[0:n]

? ? copy(slice[m:n],data)

? ? returnslice

}

從字符串生成字節(jié)切片:

一個字符串本質上是一個字節(jié)數(shù)組厌衙,所以可以像對普通數(shù)組那樣,生成切片绞绒,而字符串生成的數(shù)組則就是字節(jié)數(shù)組婶希。

切片和垃圾回收:

切片的底層指向一個數(shù)組,該數(shù)組的實際體積可能要大于切片所定義的體積蓬衡。只有在沒有任何切片指向的時候喻杈,底層的數(shù)組內層才會被釋放,這種特性有時會導致程序占用多余的內存狰晚。

append 函數(shù)常見操作:

將切片 b 的元素追加到切片 a 之后:a = append(a, b...) ?//這里三個點表示把b切片的所有數(shù)據(jù)追加到a切片后面

復制切片 a 的元素到新的切片 b 上:

b =make([]T,len(a))copy(b, a)

刪除位于索引 i 的元素:a = append(a[:i], a[i+1:]...)

切除切片 a 中從索引 i 至 j 位置的元素:a = append(a[:i], a[j:]...)

為切片 a 擴展 j 個元素長度:a = append(a, make([]T, j)...)

在索引 i 的位置插入元素 x:a = append(a[:i], append([]T{x}, a[i:]...)...)

在索引 i 的位置插入長度為 j 的新切片:a = append(a[:i], append(make([]T, j), a[i:]...)...)

在索引 i 的位置插入切片 b 的所有元素:a = append(a[:i], append(b, a[i:]...)...)

取出位于切片 a 最末尾的元素 x:x, a = a[len(a)-1], a[:len(a)-1]

將元素 x 追加到切片 a:a = append(a, x)

使用slice時需要注意的問題:

arr := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

s1 := arr[2:6]

s2 := arr[5:10]

s2[0] = 99

fmt.Println(s1, s2)? // [3 4 5 99] [99 7 8 9 10] 可以看出s1和s2的重疊部分會在其中一個改變時改變筒饰。

但是:

arr := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

s1 := arr[2:6]

s2 := arr[5:10]

s1 = append(s1, 1, 2, 3, 4, 5, 6, 7, 8, 9)

s2[0] = 99

fmt.Println(s1, s2)?

輸出:

[3 4 5 6 1 2 3 4 5 6 7 8 9] [99 7 8 9 10]?

可以看出,s1之前和s2重疊部分的數(shù)據(jù)沒有隨s2的改變而改變壁晒,因為瓷们,append在給s1增加元素時已經(jīng)超出了s1的容量,所以重新為s1分配了一塊連續(xù)的內存,此時s1和s2指向已經(jīng)不是同一塊內存中的數(shù)組了换棚,所以s2的改變時無法影響s1了式镐。


刪除slice中指定的元素

因為slice引用指向底層數(shù)組,數(shù)組的長度不變元素是不能刪除的固蚤,所以刪除的原理就是排除待刪除元素后用其他元素重新構造一個數(shù)組

func? deleteByAppend (i int) []int {?

? ? ? i :=3

? ? ? s := []int{1,2,3,4,5,6,7}

? ? ? s = append(s[:i], s[i+1:]...)

? ? ? ?return s

}

func ?deleteByCopy (i int) []int { ? ?

? ? ? ?s := []int{1,2,3,4,5,6,7}

? ? ? ?copy(s[i:], s[i+1:])? ??

? ? ? ? s = s[:len(s)-1]

? ? ? ? return s

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市歹茶,隨后出現(xiàn)的幾起案子夕玩,更是在濱河造成了極大的恐慌,老刑警劉巖惊豺,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件燎孟,死亡現(xiàn)場離奇詭異,居然都是意外死亡尸昧,警方通過查閱死者的電腦和手機揩页,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烹俗,“玉大人爆侣,你說我怎么就攤上這事〈蓖” “怎么了兔仰?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蕉鸳。 經(jīng)常有香客問我乎赴,道長,這世上最難降的妖魔是什么潮尝? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任榕吼,我火速辦了婚禮,結果婚禮上勉失,老公的妹妹穿的比我還像新娘羹蚣。我一直安慰自己,他們只是感情好戴质,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布度宦。 她就那樣靜靜地躺著,像睡著了一般告匠。 火紅的嫁衣襯著肌膚如雪戈抄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天后专,我揣著相機與錄音划鸽,去河邊找鬼。 笑死,一個胖子當著我的面吹牛裸诽,可吹牛的內容都是我干的嫂用。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼丈冬,長吁一口氣:“原來是場噩夢啊……” “哼嘱函!你這毒婦竟也來了?” 一聲冷哼從身側響起埂蕊,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤往弓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蓄氧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體函似,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年喉童,在試婚紗的時候發(fā)現(xiàn)自己被綠了撇寞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡堂氯,死狀恐怖蔑担,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情祖灰,我是刑警寧澤钟沛,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站局扶,受9級特大地震影響恨统,放射性物質發(fā)生泄漏。R本人自食惡果不足惜三妈,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一畜埋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧畴蒲,春花似錦悠鞍、人聲如沸喊废。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砾赔。三九已至蔫骂,卻和暖如春么翰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辽旋。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工浩嫌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留檐迟,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓码耐,卻偏偏與公主長得像追迟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子骚腥,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內容

  • 最近在寫個性化推薦的論文敦间,經(jīng)常用到Python來處理數(shù)據(jù),被pandas和numpy中的數(shù)據(jù)選取和索引問題繞的比較...
    shuhanrainbow閱讀 4,535評論 6 19
  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經(jīng)驗束铭。 張土汪:刷leetcod...
    土汪閱讀 12,724評論 0 33
  • 其本身并不是數(shù)組每瞒,它指向底層的數(shù)組作為變長數(shù)組的替代方案,可以關聯(lián)底層數(shù)組的局部或全部為引用類型可以直接創(chuàng)建或從底...
    haokeed閱讀 224評論 0 0
  • fmt格式化字符串 格式:%[旗標][寬度][.精度][arg索引]動詞旗標有以下幾種:+: 對于數(shù)值類型總是輸出...
    皮皮v閱讀 1,089評論 0 3
  • 項目經(jīng)理:由執(zhí)行組織委派纯露,領導團隊實現(xiàn)項目目標的個人。職能經(jīng)理:專注于對某個職能領域或業(yè)務單元的管理和監(jiān)督代芜。運營經(jīng)...
    六月_6閱讀 308評論 0 1