最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go的切片擴容機制詳解

 更新時間:2023年04月03日 09:24:45   作者:走,我們?nèi)ゴ碉L(fēng)  
本文主要介紹了go的切片擴容機制詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

切片的擴容策略?如何擴容?

擴容策略:如果切片的容量小于 1024 個元素,于是擴容的時候就翻倍增加容量???cè)萘繌脑瓉淼?個翻倍到現(xiàn)在的2個。

一旦元素個數(shù)超過 1024 個元素,那么增長因子就變成 1.25 ,即每次增加原來容量的四分之一。

注意:擴容擴大的容量都是針對原來的容量而言的,而不是針對原來數(shù)組的長度而言的。

舉一個擴容策略例子:

func main() {
? ? slice := []int{10, 20, 30, 40}
? ? newSlice := append(slice, 50)
? ? fmt.Printf("Before slice = %v, Pointer = %p, len = %d, cap = %d\n", slice, &slice, len(slice), cap(slice))
? ? fmt.Printf("Before newSlice = %v, Pointer = %p, len = %d, cap = %d\n", newSlice, &newSlice, len(newSlice), cap(newSlice))
? ? newSlice[1] += 10
? ? fmt.Printf("After slice = %v, Pointer = %p, len = %d, cap = %d\n", slice, &slice, len(slice), cap(slice))
? ? fmt.Printf("After newSlice = %v, Pointer = %p, len = %d, cap = %d\n", newSlice, &newSlice, len(newSlice), cap(newSlice))
}

// result?
Before slice = [10 20 30 40], Pointer = 0xc4200b0140, len = 4, cap = 4
Before newSlice = [10 20 30 40 50], Pointer = 0xc4200b0180, len = 5, cap = 8
After slice = [10 20 30 40], Pointer = 0xc4200b0140, len = 4, cap = 4
// 相加的數(shù)是在新的切片上相加的
After newSlice = [10 30 30 40 50], Pointer = 0xc4200b0180, len = 5, cap = 8

 從結(jié)果我們可以看出,新切片和之前的切片已經(jīng)不同了,因為新的切片更改了一個值,并沒有影響到原來的數(shù)組,新切片指向的數(shù)組是一個全新的數(shù)組,并且cap容量也發(fā)生了變化。

那么到底是新數(shù)組還是老數(shù)組呢?
擴容之后數(shù)組就一定是新的嗎?其實是分兩種情況。

第一種情況:

func main() {
? ? array := [4]int{10, 20, 30, 40}
? ? slice := array[0:2]
? ? newSlice := append(slice, 50)
? ? fmt.Printf("Before slice = %v, Pointer = %p, len = %d, cap = %d\n", slice, &slice, len(slice), cap(slice))
? ? fmt.Printf("Before newSlice = %v, Pointer = %p, len = %d, cap = %d\n", newSlice, &newSlice, len(newSlice), cap(newSlice))
? ? newSlice[1] += 10
? ? fmt.Printf("After slice = %v, Pointer = %p, len = %d, cap = %d\n", slice, &slice, len(slice), cap(slice))
? ? fmt.Printf("After newSlice = %v, Pointer = %p, len = %d, cap = %d\n", newSlice, &newSlice, len(newSlice), cap(newSlice))
? ? fmt.Printf("After array = %v\n", array)
}

// result
? ? Before slice = [10 20], Pointer = 0xc4200c0040, len = 2, cap = 4
? ? Before newSlice = [10 20 50], Pointer = 0xc4200c0060, len = 3, cap = 4
? ? After slice = [10 30], Pointer = 0xc4200c0040, len = 2, cap = 4
? ? After newSlice = [10 30 50], Pointer = 0xc4200c0060, len = 3, cap = 4
? ? After array = [10 30 50 40]

通過這個結(jié)果可以明顯的看出,修改新切片的值居然影響到了老切片的值了,擴容以后并沒有新建一個新的數(shù)組,并且append操作也改變了原來數(shù)組的值,如果原數(shù)組上有多個切片,那么這些切片都會影響,產(chǎn)生了莫名的bug!

這種情況也極容易出現(xiàn)在字面量創(chuàng)建切片時候,第三個參數(shù) cap 傳值的時候,如果用字面量創(chuàng)建切片,cap 并不等于指向數(shù)組的總?cè)萘?,那么這種情況就會發(fā)生。

注意:建議用字面量創(chuàng)建切片的時候,cap 的值一定要保持清醒,避免共享原數(shù)組導(dǎo)致的 bug。

第二種情況:

第二種情況就是擴容策略的例子了,在擴容之后產(chǎn)生了新的切片,因為原數(shù)組的容量達到了最大值,再擴容都會開出一片新的內(nèi)存,把原來的值拷貝過來,再進行后續(xù)操作也不會影響原數(shù)組。

總結(jié):時刻保持cap的清醒,推薦使用第二種情況的擴容策略

到此這篇關(guān)于go的切片擴容機制詳解的文章就介紹到這了,更多相關(guān)go 切片擴容 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang time常用方法詳解

    golang time常用方法詳解

    這篇文章主要介紹了golang time常用方法詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Golang通道channel的源碼分析

    Golang通道channel的源碼分析

    channel(通道),顧名思義,是一種通道,一種用于并發(fā)環(huán)境中數(shù)據(jù)傳遞的通道。channel是golang中標(biāo)志性的概念之一,很好很強大!本文將從源碼帶大家了解一下channel的使用,希望對大家有所幫助
    2022-12-12
  • Go通用的?MapReduce?工具函數(shù)詳解

    Go通用的?MapReduce?工具函數(shù)詳解

    本文介紹了使用Go語言實現(xiàn)的MapReduce框架,特別是在AWSS3?SDK的MultiPartUpload功能中的應(yīng)用,包括并發(fā)上傳和錯誤處理策略,詳細解釋了如何通過并發(fā)goroutines提高上傳效率,并通過MapReduce模型優(yōu)化代碼結(jié)構(gòu)和處理流程,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 淺析Go語言中閉包的定義與使用

    淺析Go語言中閉包的定義與使用

    閉包是編程語言中的一個重要概念,它允許函數(shù)不僅僅是獨立的代碼塊,還可以攜帶數(shù)據(jù)和狀態(tài),本文將深入探討閉包的定義、用途和注意事項,以及如何正確使用閉包,有需要的可以參考下
    2023-09-09
  • golang?gorm開發(fā)架構(gòu)及寫插件示例

    golang?gorm開發(fā)架構(gòu)及寫插件示例

    這篇文章主要為大家介紹了golang?gorm開發(fā)架構(gòu)及寫插件的詳細示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Go語言編程中對文件讀寫的基本方法整理

    Go語言編程中對文件讀寫的基本方法整理

    這篇文章主要介紹了Go語言編程中對文件讀寫的基本方法整理,是Go語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • Go語言實現(xiàn)配置熱加載的方法分享

    Go語言實現(xiàn)配置熱加載的方法分享

    web項目,經(jīng)常需要熱啟動各種各樣的配置信息,一旦這些服務(wù)發(fā)生變更,我們需要重新啟動web server,以使配置生效,實現(xiàn)配置熱加載,本文為大家整理了幾個方法實現(xiàn)這個需求,需要的可以參考下
    2023-05-05
  • go實現(xiàn)一個分布式限流器的方法步驟

    go實現(xiàn)一個分布式限流器的方法步驟

    項目中需要對api的接口進行限流,本文主要介紹了go實現(xiàn)一個分布式限流器的方法步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 在golang xorm中使用postgresql的json,array類型的操作

    在golang xorm中使用postgresql的json,array類型的操作

    這篇文章主要介紹了在golang xorm中使用postgresql的json,array類型的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言擴展原語之Semaphore的用法詳解

    Go語言擴展原語之Semaphore的用法詳解

    Go語言的擴展包中提供了帶權(quán)重的信號量?semaphore.Weighted,讓我們可以按照不同的權(quán)重管理資源的訪問,下面小編就來和大家聊聊它們的具體用法吧
    2023-07-07

最新評論

泗阳县| 多伦县| 乌拉特后旗| 化州市| 丹棱县| 建始县| 塘沽区| 报价| 丹凤县| 正宁县| 虹口区| 鹤庆县| 西昌市| 望城县| 赫章县| 互助| 图们市| 元谋县| 万载县| 从化市| 万宁市| 册亨县| 沾化县| 哈巴河县| 阜新市| 天气| 宁陕县| 会东县| 达日县| 墨玉县| 静宁县| 南溪县| 武清区| 黔西| 苍溪县| 宁德市| 左贡县| 敖汉旗| 东宁县| 齐齐哈尔市| 台南县|