当前位置: 代码网 > it编程>前端脚本>Golang > Golang Slice和map的坑

Golang Slice和map的坑

2024年05月26日 Golang 我要评论
一、浅拷贝同根func main() {nums := [3]int{}nums[0] = 1fmt.printf("nums: %v , len: %d, cap: %d ", nums, len

一、浅拷贝同根

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若不是深拷贝或者重新生成新空间,无论通过参数传递还是使用 := 或者 [:]赋值都存在同根性。       

二、扩容摆脱同根

slice与array最大的区别在于slice不需要指定大小会自动扩容等一些特性,我们在接受并习惯同根性后。slice在多次append元素时,若满足扩容策略,这时候内部就会重新申请一块内存空间,将原本的元素拷贝一份到新的内存空间上。此时其与原本的数组就没有任何关联关系了,再进行修改值也不会变动到原始数组。

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

通过输出来看我们会发现不管是数据还是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.

输出结果是不是出乎意料!不过聪明如你肯定已经通过自己的经验想到了答案。

一个有分配空间(empty)一个没有分配空间(nil)

以上就是我使用slice遇到的坑,这里不再针对map做特殊分析了。

到此这篇关于golang slice和map的坑的文章就介绍到这了,更多相关golang slice和map内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com