Golang Slice和map的坑
一、淺拷貝同根
func main() { nums := [3]int{} nums[0] = 1 fmt.Printf("nums: %v , len: %d, cap: %d\n", nums, len(nums), cap(nums)) dnums := nums[0:2] dnums[0] = 5 fmt.Printf("nums: %v ,len: %d, cap: %d\n", nums, len(nums), cap(nums)) fmt.Printf("dnums: %v, len: %d, cap: %d\n", dnums, len(dnums), cap(dnums)) }
輸出:
nums: [1 0 0] , len: 3, cap: 3
nums: [5 0 0] ,len: 3, cap: 3
dnums: [5 0], len: 2, cap: 3
slice若不是深拷貝或者重新生成新空間,無(wú)論通過(guò)參數(shù)傳遞還是使用 := 或者 [:]賦值都存在同根性。
二、擴(kuò)容擺脫同根
Slice與Array最大的區(qū)別在于Slice不需要指定大小會(huì)自動(dòng)擴(kuò)容等一些特性,我們?cè)诮邮懿⒘?xí)慣同根性后。Slice在多次append元素時(shí),若滿足擴(kuò)容策略,這時(shí)候內(nèi)部就會(huì)重新申請(qǐng)一塊內(nèi)存空間,將原本的元素拷貝一份到新的內(nèi)存空間上。此時(shí)其與原本的數(shù)組就沒(méi)有任何關(guān)聯(lián)關(guān)系了,再進(jìn)行修改值也不會(huì)變動(dòng)到原始數(shù)組。
func main() { nums := [3]int{} nums[0] = 1 fmt.Printf("nums: %v , len: %d, cap: %d\n", nums, len(nums), cap(nums)) dnums := nums[0:2] dnums = append(dnums, []int{2, 3}...) dnums[1] = 1 fmt.Printf("nums: %v ,len: %d, cap: %d\n", nums, len(nums), cap(nums)) fmt.Printf("dnums: %v, len: %d, cap: %d\n", dnums, len(dnums), cap(dnums)) }
輸出 :
nums: [1 0 0] , len: 3, cap: 3
nums: [1 0 0] ,len: 3, cap: 3
dnums: [1 1 2 3], len: 4, cap: 6
三、Empty與nil
Empty
func main() { nums := []int{} renums := make([]int, 0) fmt.Printf("nums: %v, len: %d, cap: %d\n", nums, len(nums), cap(nums)) fmt.Printf("renums: %v, len: %d, cap: %d\n", renums, len(renums), cap(renums)) }
輸出:
nums: [], len: 0, cap: 0
renums: [], len: 0, cap: 0
nil
func main() { var nums []int fmt.Println(nums,len(nums),cap(nums)) }
輸出
[] 0 0
通過(guò)輸出來(lái)看我們會(huì)發(fā)現(xiàn)不管是數(shù)據(jù)還是len 和cap都是相同的輸出內(nèi)容。
那我們就來(lái)用代碼來(lái)證明一下他們是否真的一致
func main() { var nums []int renums := make([]int, 0) if nums == nil { fmt.Println("nums is nil.") } if renums == nil { fmt.Println("renums is nil.") } }
輸出:
nums is nil.
輸出結(jié)果是不是出乎意料!不過(guò)聰明如你肯定已經(jīng)通過(guò)自己的經(jīng)驗(yàn)想到了答案。
一個(gè)有分配空間(Empty)一個(gè)沒(méi)有分配空間(nil)
以上就是我使用slice遇到的坑,這里不再針對(duì)map做特殊分析了。
到此這篇關(guān)于Golang Slice和map的坑的文章就介紹到這了,更多相關(guān)Golang Slice和map內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang常用庫(kù)之字段參數(shù)驗(yàn)證庫(kù)-validator使用詳解
這篇文章主要介紹了golang常用庫(kù):字段參數(shù)驗(yàn)證庫(kù)-validator使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借價(jià)值,需要的朋友可以參考下2020-10-10一文帶你掌握掌握 Golang結(jié)構(gòu)體與方法
在 Golang 中,結(jié)構(gòu)體和方法是實(shí)現(xiàn)面向?qū)ο缶幊痰闹匾M成部分,也是 Golang 的核心概念之一。在本篇文章中,我們將深入介紹 Golang 結(jié)構(gòu)體與方法的概念、使用方法以及相關(guān)的編程技巧和最佳實(shí)踐2023-04-04Go語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)開點(diǎn)線段樹詳解
線段樹是一種用于高效處理區(qū)間查詢和區(qū)間更新的數(shù)據(jù)結(jié)構(gòu),下面我們就來(lái)看看如何使用Go實(shí)現(xiàn)動(dòng)態(tài)開點(diǎn)線段樹的方式,感興趣的可以了解下2025-02-02