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不需要指定大小會自動擴容等一些特性,我們在接受并習(xí)慣同根性后。Slice在多次append元素時,若滿足擴容策略,這時候內(nèi)部就會重新申請一塊內(nèi)存空間,將原本的元素拷貝一份到新的內(nèi)存空間上。此時其與原本的數(shù)組就沒有任何關(guān)聯(lián)關(guā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都是相同的輸出內(nè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é)果是不是出乎意料!不過聰明如你肯定已經(jīng)通過自己的經(jīng)驗想到了答案。
一個有分配空間(Empty)一個沒有分配空間(nil)
以上就是我使用slice遇到的坑,這里不再針對map做特殊分析了。
到此這篇關(guān)于Golang Slice和map的坑的文章就介紹到這了,更多相關(guān)Golang Slice和map內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang常用庫之字段參數(shù)驗證庫-validator使用詳解
這篇文章主要介紹了golang常用庫:字段參數(shù)驗證庫-validator使用,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借價值,需要的朋友可以參考下2020-10-10
一文帶你掌握掌握 Golang結(jié)構(gòu)體與方法
在 Golang 中,結(jié)構(gòu)體和方法是實現(xiàn)面向?qū)ο缶幊痰闹匾M成部分,也是 Golang 的核心概念之一。在本篇文章中,我們將深入介紹 Golang 結(jié)構(gòu)體與方法的概念、使用方法以及相關(guān)的編程技巧和最佳實踐2023-04-04

