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若不是深拷貝或者重新生成新空間,無論通過參數(shù)傳遞還是使用 := 或者 [:]賦值都存在同根性。
二、擴容擺脫同根
Slice與Array最大的區(qū)別在于Slice不需要指定大小會自動擴容等一些特性,我們在接受并習慣同根性后。Slice在多次append元素時,若滿足擴容策略,這時候內部就會重新申請一塊內存空間,將原本的元素拷貝一份到新的內存空間上。此時其與原本的數(shù)組就沒有任何關聯(lián)關系了,再進行修改值也不會變動到原始數(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
通過輸出來看我們會發(fā)現(xiàn)不管是數(shù)據(jù)還是len 和cap都是相同的輸出內容。
那我們就來用代碼來證明一下他們是否真的一致
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.
輸出結果是不是出乎意料!不過聰明如你肯定已經(jīng)通過自己的經(jīng)驗想到了答案。
一個有分配空間(Empty)一個沒有分配空間(nil)
以上就是我使用slice遇到的坑,這里不再針對map做特殊分析了。
到此這篇關于Golang Slice和map的坑的文章就介紹到這了,更多相關Golang Slice和map內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
golang常用庫之字段參數(shù)驗證庫-validator使用詳解
這篇文章主要介紹了golang常用庫:字段參數(shù)驗證庫-validator使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借價值,需要的朋友可以參考下2020-10-10