[golang]slice的坑:從append到共享

go是宣揚(yáng)實(shí)用主義的語(yǔ)言枚冗,很多時(shí)候都把c中的最佳實(shí)踐直接規(guī)定成語(yǔ)法了。其中之一就是slice,簡(jiǎn)單但是非常容易踩坑壁晒。

先看一個(gè)小例子:

func main() {
    a := make([]int, 2, 2)
    a[0], a[1] = 1, 2

    b := append(a[0:1], 3)
    c := append(a[1:2], 4)

    fmt.Println(b,c)
}

在這個(gè)小例子中,原本是希望將a[0:1]作為b的前綴业栅,然后追加上3秒咐;將a[1:2]作為c的前綴谬晕,然后追加上4。但實(shí)際上輸出結(jié)果并不是原本期望的[1 3] [2 4]携取,而變成了[1 3] [3 4]攒钳。這是為什么呢?

我們知道數(shù)據(jù)結(jié)構(gòu)中數(shù)組是非常高效的雷滋,可以直接尋址不撑,但是有個(gè)缺陷,難以擴(kuò)容晤斩。所以slice被設(shè)計(jì)為指向數(shù)組的指針焕檬,在需要擴(kuò)容時(shí),會(huì)將底層數(shù)組上的值復(fù)制到一個(gè)更大的數(shù)組上然后指向這個(gè)新數(shù)組澳泵。

slice有個(gè)特性是允許多個(gè)slice指向同一個(gè)底層數(shù)組实愚,這是一個(gè)有用的特性,在很多場(chǎng)景下都能通過(guò)這個(gè)特性實(shí)現(xiàn) no copy 而提高效率兔辅。但共享同時(shí)意味著不安全腊敲。b在追加3時(shí)實(shí)際上覆蓋了a[1],導(dǎo)致c變成了[3 4]维苔。

怎么解決呢碰辅?防止共享數(shù)據(jù)的出現(xiàn)問(wèn)題需要注意兩條,只讀和復(fù)制蕉鸳,或者統(tǒng)一歸納為不可變乎赴。

寫法1,make出一個(gè)新slice潮尝,然后先copy前綴到新數(shù)組上再追加:

func main() {
    a := make([]int, 2, 2)
    a[0], a[1] = 1, 2

    b := make([]int, 1)
    copy(b, a[0:1])
    b = append(b, 3)

    c := make([]int, 1)
    copy(c, a[1:2])
    c = append(c, 4)

    fmt.Println(b, c)
}

寫法2榕吼,利用go中slice的一個(gè)小眾語(yǔ)法,a[0:1:1] (源[起始index勉失,終止index羹蚣,cap終止index]),強(qiáng)迫追加時(shí)復(fù)制到新數(shù)組乱凿。

func main() {
    a := make([]int, 2, 2)
    a[0], a[1] = 1, 2

    b := append(a[0:1:1], 3)
    c := append(a[1:2:2], 4)

    fmt.Println(b, c)
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顽素,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子徒蟆,更是在濱河造成了極大的恐慌胁出,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件段审,死亡現(xiàn)場(chǎng)離奇詭異全蝶,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門抑淫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)绷落,“玉大人,你說(shuō)我怎么就攤上這事始苇∑鏊福” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵催式,是天一觀的道長(zhǎng)函喉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蓄氧,這世上最難降的妖魔是什么函似? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮喉童,結(jié)果婚禮上撇寞,老公的妹妹穿的比我還像新娘。我一直安慰自己堂氯,他們只是感情好蔑担,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著咽白,像睡著了一般啤握。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晶框,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天排抬,我揣著相機(jī)與錄音,去河邊找鬼授段。 笑死蹲蒲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的侵贵。 我是一名探鬼主播届搁,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窍育!你這毒婦竟也來(lái)了卡睦?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤漱抓,失蹤者是張志新(化名)和其女友劉穎表锻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體乞娄,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瞬逊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年檐迟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片码耐。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖溶其,靈堂內(nèi)的尸體忽然破棺而出骚腥,到底是詐尸還是另有隱情,我是刑警寧澤瓶逃,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布束铭,位于F島的核電站,受9級(jí)特大地震影響厢绝,放射性物質(zhì)發(fā)生泄漏契沫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一昔汉、第九天 我趴在偏房一處隱蔽的房頂上張望懈万。 院中可真熱鬧,春花似錦靶病、人聲如沸会通。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)涕侈。三九已至,卻和暖如春煤辨,著一層夾襖步出監(jiān)牢的瞬間裳涛,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工众辨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留端三,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓泻轰,卻偏偏與公主長(zhǎng)得像技肩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浮声,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 轉(zhuǎn)載自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay閱讀 6,131評(píng)論 1 5
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,905評(píng)論 2 89
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理虚婿,服務(wù)發(fā)現(xiàn),斷路器泳挥,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • 今天是大二第二學(xué)期的第一天然痊,奔波了1天多的車程,于昨日下午5點(diǎn)多到了學(xué)校屉符,簡(jiǎn)單地收拾了下宿舍剧浸,去學(xué)生街購(gòu)買了...
    Lancy蘭希閱讀 238評(píng)論 0 0
  • 今天外面真的好冷锹引,本想就安靜的坐著等到下課,后來(lái)覺(jué)得還是把要辦的事做了吧唆香!自己平時(shí)總是這樣嫌变,抱怨時(shí)間那么緊張,想出...
    李李和她的朋友閱讀 231評(píng)論 0 0