golang數(shù)組array和切片slice的區(qū)別

數(shù)組

定義

數(shù)組是固定長度的特定元素類型的序列

特點

  • 長度固定,初始化時長度可以用...代替口四,標識根據(jù)數(shù)組數(shù)據(jù)計算其長度孵运,也可以是一個常量值;不可以對數(shù)組進行增刪操作蔓彩。
  • 長度是數(shù)組類型的一部分治笨,[3]int和[5]int是兩種不同的類型
  • 數(shù)組是值傳遞的,函參數(shù)組是數(shù)組值的復制赤嚼。

應用場景

數(shù)組在golang中的使用場景較少旷赖。一般只在數(shù)組長度確定并且不發(fā)生變更的情況下會使用數(shù)組,此時要比使用切片性能更優(yōu)更卒。例如等孵,存儲excel文件解析時列字段順序枚舉。

切片

定義

切片是不定長的特定元素類型的序列

特點

  • 切片的長度是不固定的蹂空,可以針對切片進行添加和截取操作俯萌。
  • 切片的底層實現(xiàn)是一個結構體,包括長度上枕、容量和一個指向?qū)嶋H數(shù)組的unsafe.Pointer指針绳瘟。
type slice struct {
        array unsafe.Pointer
        len   int
        cap   int
}
  • 淺拷貝:長度是切片實際存儲元素的個數(shù),容量是切片目前可以存儲元素的個數(shù)姿骏,長度<容量糖声,當操作切片大于容量時,會產(chǎn)生數(shù)組越界的panic。
  • 深拷貝:切片的淺拷貝是底層匿名數(shù)組的引用的復制蘸泻,非擴容情況下任何一個拷貝值發(fā)生變化琉苇,所有切片均會發(fā)生變化
func main() {
    // 切片實質(zhì)上是對底層匿名數(shù)組的引用
    slice := make([]int, 5, 5)
    slice1 := slice
    slice2 := slice[:]
    slice3 := slice[0:4]
    slice4 := slice[1:5]
    slice[1] = 1
    fmt.Println(slice)//[0 1 0 0 0]
    fmt.Println(slice1)//[0 1 0 0 0]
    fmt.Println(slice2)//[0 1 0 0 0]
    fmt.Println(slice3)//[0 1 0 0]
    fmt.Println(slice4)//[1 0 0 0]
}
  • 切片的深拷貝是切片的值的復制,拷貝值與原值底層指向兩個不同的數(shù)組悦施,這種copy需要提前申請空間并扇。
func main() {
    // 當元素數(shù)量超過容量
    // 切片會在底層申請新的數(shù)組
    slice := make([]int, 5, 5)
    slice1 := slice
    slice = append(slice, 1)
    slice[0] = 1
    fmt.Println(slice)//[1 0 0 0 0 1]
    fmt.Println(slice1)//[0 0 0 0 0]
    // copy 函數(shù)提供深拷貝功能
    // 但需要在拷貝前申請空間
    slice2 := make([]int, 4, 4)
    slice3 := make([]int, 5, 5)
    fmt.Println(copy(slice2, slice))//4
    fmt.Println(copy(slice3, slice))//5
    slice2[1] = 2
    slice3[1] = 3
    fmt.Println(slice)//[1 0 0 0 0 1]
    fmt.Println(slice2)//[1 2 0 0]
    fmt.Println(slice3)//[1 3 0 0 0]
}
  • 容量擴容:切片的容量不足以支撐切片的append操作時,會自動擴容抡诞,擴容規(guī)則:
  1. 如果擴容需求大于當前容量的兩倍穷蛹,擴容后的容量為所需的最小容量
  2. 當前切片長度<1024,擴容當前容量為2倍,
  3. 當前切片長度>1024,每次擴容當前容量的1.25倍昼汗,循環(huán)擴容直至容量滿足需求
    切片擴容之后肴熏,指向匿名數(shù)組的指針地址會發(fā)生變化。
newcap := old.cap
doublecap := newcap + newcap
if cap > doublecap {
    newcap = cap
} else {
    if old.len < 1024 {
        newcap = doublecap    
    } else { 
         // Check 0 < newcap to detect overflow         
        // and prevent an infinite loop.        
        for 0 < newcap && newcap < cap { 
            newcap += newcap / 4         
        }        
        // Set newcap to the requested cap when         
        // the newcap calculation overflowed.         
        if newcap <= 0 { 
            newcap = cap         
        }    
    }
}

應用場景

切片的應用場景比較廣泛顷窒,任何需要動態(tài)擴展數(shù)組的地方都可以使用切片蛙吏。例如:接收前端傳入的固定類型的參數(shù)列表。

轉(zhuǎn)換

數(shù)組和切片

//copy 是值復制
var a = []int{1,2,3,4,5}
var b = [5]int{}
fmt.Println(copy(b[0:5],a))
fmt.Println(b)
a[0]=6
fmt.Println(a)
fmt.Println(b)

切片轉(zhuǎn)數(shù)組

s := make([]int,3)
var a = [3]int{1,2,3}
fmt.Println(copy(a[0:3],s)) //3
fmt.Println(s) //[1,2,3]

//copy 需要提前申請空間
s := make([]int,0)
var a = [3]int{1,2,3}
fmt.Println(copy(a[0:3],s)) //0
fmt.Println(s) //[]
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鞋吉,一起剝皮案震驚了整個濱河市鸦做,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谓着,老刑警劉巖泼诱,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赊锚,居然都是意外死亡治筒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門改抡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矢炼,“玉大人系瓢,你說我怎么就攤上這事阿纤。” “怎么了夷陋?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵欠拾,是天一觀的道長。 經(jīng)常有香客問我骗绕,道長藐窄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任酬土,我火速辦了婚禮荆忍,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己刹枉,他們只是感情好叽唱,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著微宝,像睡著了一般棺亭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蟋软,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天镶摘,我揣著相機與錄音,去河邊找鬼岳守。 笑死凄敢,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的棺耍。 我是一名探鬼主播贡未,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蒙袍!你這毒婦竟也來了俊卤?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤害幅,失蹤者是張志新(化名)和其女友劉穎消恍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體以现,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡狠怨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了邑遏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佣赖。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖记盒,靈堂內(nèi)的尸體忽然破棺而出憎蛤,到底是詐尸還是另有隱情,我是刑警寧澤纪吮,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布俩檬,位于F島的核電站,受9級特大地震影響碾盟,放射性物質(zhì)發(fā)生泄漏棚辽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一冰肴、第九天 我趴在偏房一處隱蔽的房頂上張望屈藐。 院中可真熱鬧榔组,春花似錦、人聲如沸联逻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遣妥。三九已至擅编,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間箫踩,已是汗流浹背爱态。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留境钟,地道東北人锦担。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像慨削,于是被迫代替她去往敵國和親洞渔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

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

  • 數(shù)組類型的值(以下簡稱數(shù)組)的長度是固定的缚态,而切片類型的值(以下簡稱切片)是可變長的磁椒。 ?數(shù)組的長度在聲明它的時候...
    one_zheng閱讀 1,179評論 0 3
  • 數(shù)組: 語法: 數(shù)組類型的值(以下簡稱數(shù)組)的長度是固定的數(shù)組的長度在聲明它的時候就必須給定,并且在之后不會再改變...
    niyiwei閱讀 1,107評論 0 1
  • 1玫芦、數(shù)組 golang中的數(shù)組是一種由固定長度和固定對象類型所組成的數(shù)據(jù)類型浆熔。例如下面: a是一個擁有4個int類...
    杰克慢閱讀 1,247評論 0 0
  • 切片(slice)是 Golang 中一種比較特殊的數(shù)據(jù)結構,這種數(shù)據(jù)結構更便于使用和管理數(shù)據(jù)集合桥帆。切片是圍繞動態(tài)...
    小孩真笨閱讀 1,074評論 0 1
  • 數(shù)組 數(shù)組在go語言中為值類型 數(shù)組之間可以用= =或!=比較,但是數(shù)組長度也是類型的一部分,因此不同長度的數(shù)組為...
    Link_Biao閱讀 7,441評論 0 0