当前位置:首页 > 话题广场 > 攻略专题 > 游戏问答

10内存如何分配?终于找到答案了Go 切片内存分配

切片是数组的抽象。切片使用数组作为基本结构。片包含三个组件:容量、长度和指向基本数组的指针。


通过使用 append 或 copy 函数可以增加切片的容量。 append 函数可以为数组的末尾增加值,并在需要时增加容量。s :=[]string{} for i:=0;i<10;i++ { s = append(s,"i") t.Log(len(s),cap(s)) } 123456 slice_test.go:25: 1 1 slice_test.go:25: 2 2 slice_test.go:25: 3 4 slice_test.go:25: 4 4 slice_test.go:25: 5 8 slice_test.go:25: 6 8 slice_test.go:25: 7 8 slice_test.go:25: 8 8 slice_test.go:25: 9 16 slice_test.go:25: 10 16 12345678910

当前储存空间存不下数据时,空间会以之前的空间数*2

比如:

numbers := make([]int,5,10) numbers = append(numbers, 1,2,3,4,5) t.Log(numbers,cap(numbers)) 123

定义 numbers 的数组长度为5 ,空间给他10,并追加数据到切片。

slice_test.go:11: [0 0 0 0 0 1 2 3 4 5] 10 1

空间为10, 当我们再添加一个数据到切片时候,空间是多少了呢?

numbers := make([]int,5,10) numbers = append(numbers, 1,2,3,4,5,6) t.Log(numbers,cap(numbers)) 123 slice_test.go:11: [0 0 0 0 0 1 2 3 4 5 6] 20 1

得到数据为20,和我们设想的一样。

注意

切片中的数据是共用内存,也就是我们选区切片区间的某一个值,并且在这个小对象中进行数据的修改,会影响整个切片的值,在开发当中非常要注意这种。

举个例子:

numbers := make([]int,5,10) numbers = append(numbers, 1,2,3,4,5) t.Log(numbers,cap(numbers)) first := numbers[5:7] second := numbers[6:8] t.Log(first,len(first),cap(first)) t.Log(second,len(second),cap(second)) second[0] = 9 t.Log(first,len(first),cap(first)) t.Log(second,len(second),cap(second)) t.Log(numbers) 12345678910111213

取了一个first 和second 这两个数据重合的数据是2.

打印一下:

slice_test.go:11: [0 0 0 0 0 1 2 3 4 5] 10 slice_test.go:15: [1 2] 2 5 slice_test.go:16: [2 3] 2 4 slice_test.go:19: [1 9] 2 5 slice_test.go:20: [9 3] 2 4 slice_test.go:21: [0 0 0 0 0 1 9 3 4 5] 123456

虽然在second 中修改了数据,但是影响到了大对象numbers 的数据,还有一个要注意的是,first 小对象,他的内存分配是5,second 的空间是4,这是为啥呢?原来,这样取的小对象切片,的空间是这个切片加上大对象末尾的值

开发中如果修改了其中的一个变量,但是又不想影响大对象,这个时候会傻掉。

那如何去获取一个和numbers 一样的数据,但是又不会影响numbers呢?

我们copy一份numbers

number2 := make([]int, len(numbers)) copy(number2, numbers) t.Log(number2,cap(numbers),cap(number2)) number2[0] = 9 t.Log(number2,numbers,cap(numbers),cap(number2)) 12345678

输出一下结果:

slice_test.go:11: [0 0 0 0 0 1 2 3 4 5] 10 slice_test.go:15: [1 2] 2 5 slice_test.go:16: [2 3] 2 4 slice_test.go:19: [1 9] 2 5 slice_test.go:20: [9 3] 2 4 slice_test.go:21: [0 0 0 0 0 1 9 3 4 5] slice_test.go:25: [0 0 0 0 0 1 9 3 4 5] 10 10 slice_test.go:29: [9 0 0 0 0 1 9 3 4 5] [0 0 0 0 0 1 9 3 4 5]10 10 12345678

好,不懂在座的各位看懂了没有。没有影响的,通过copy 切片再去修改切片的值,是不会印象原切片的。

关于切片的知识,还远远不止这些,后续遇到问题,再补充吧,欢迎关注

1.《10内存如何分配?终于找到答案了Go 切片内存分配》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《10内存如何分配?终于找到答案了Go 切片内存分配》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/gl/2143482.html

上一篇

0105和0060声卡有什么区别?终于找到答案了修车必懂的发动机故障码,请收好!

下一篇

0元购邀请码怎么填?我来告诉你答案10月12日cdf会员购免税商品比价清单及值得买商品推荐

10内存如何分配?总结很全面速看!简述现在高端机上的内存扩展技术,8GB+2GB不等于10GB

10内存如何分配?总结很全面速看!简述现在高端机上的内存扩展技术,8GB+2GB不等于10GB

10内存如何分配相关介绍,一款旗舰手机入门版的存储配置为8GB 128GB。其中8GB是内存,即执行内存,128GB是闪存,即手机存储空间。 其中内存的速度更快,比闪存更能影响手机的使用体验,当然前提是闪存的容量够用。 增加内...

10内存如何分配看这里!手机内存应该怎么选?看这一篇就够了

10内存如何分配看这里!手机内存应该怎么选?看这一篇就够了

10内存如何分配相关介绍,“你的手机内存有多少?单击 “是70G。” “咦?手机内存还是70克吗?不都是64克、128克、256克吗?” “没错。我买的时候选了“6 64”。那不是70G。” ” “……” 大家在购买手机的时候...

10内存如何分配?终于找到答案了C语言内存分配问题

10内存如何分配?终于找到答案了C语言内存分配问题

10内存如何分配相关介绍,1、c的内存分为四个区域 堆栈:用于存储函数的格式参数和函数中的局部变量。 由编译器分配空间,在函数执行完后由编译器自动释放。 堆:用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手...

关于10内存如何分配,你需要知道这些2021年买手机,内存选6GB还是8GB?聪明人会这么选

关于10内存如何分配,你需要知道这些2021年买手机,内存选6GB还是8GB?聪明人会这么选

10内存如何分配相关介绍,由于安卓与iPhone系统不同,导致iPhone就算是4GB内存也能够流畅运行,畅玩大型游戏,系统流畅体验丝毫不卡顿,但如果换成是安卓手机,4GB显然不够用了,所以安卓用户今年买手机选6GB还是8GB...