You can see, after running modifyValue function, the content of slice s is changed. Although the modifyValue function just gets a copy of the memory address of slice's underlying array, it is enough!
See another example:
The result is like this:
而这一次,addValue函数并没有修改main函数中的切片s的元素 。这是因为它只是操作切片s的副本,而不是切片s本身 。所以如果真的想让函数改变切片的内容,可以传递切片的地址:
This time, the addValue function doesn't take effect on the s slice in main function. That's because it just manipulate the copy of the s, not the "real" s.
So if you really want the function to change the content of a slice, you can pass the address of the slice:
运行结果如下
Golang|切片原理在Golang语言开发过程中,我们经常会用到数组和切片数据结构,数组是固定长度go语言中切片如何作参数的,而切片是可以扩张go语言中切片如何作参数的数组,那么切片底层到底有什么不同?接下来我们来详细分析一下内部实现 。
首先我们来看一下数据结构
这里的array其实是指向切片管理的内存块首地址,而len就是切片的实际使用大小 , cap就是切片的容量 。
我们可以通过下面的代码输出slicego语言中切片如何作参数:
这么分析下来 , 我们可以了解如下内容:
使用一个切片通常有两种方法:
另一种是slice = make([]int, len, cap)这种方法,称为分配内存 。
创建一个slice,实质上是在分配内存 。
这里跟一下细节,math.MulUintptr是基于底层的指针计算乘法的 , 这样计算不会导致超出int大小,这个方法在后面会经常用到 。
同样,对于int64的长度,也有对应的方法
而实际分配内存的操作调用mallocgc这个分配内存的函数,这个函数以后再分析 。
我们了解切片和数组最大的不同就是切片能够自动扩容,接下来看看切片是如何扩容的
这里可以看到,growslice是返回了一个新的slice,也就是说如果发生了扩容 , 会发生拷贝 。
所以我们在使用过程中,如果预先知道容量,可以预先分配好容量再使用,能提高运行效率 。
copy这个函数在内部实现为slicecopy
还有关于字符串的拷贝
这里显示了可以把string拷贝成[]byte,不能把[]byte拷贝成string 。
1、切片的数据结构是 array内存地址,len长度,cap容量
2、make的时候需要注意 容量 * 长度 分配的内存大小要小于264 , 并且要小于可分配的内存量,同时长度不能大于容量 。
3、内存增长的过程:
4、当发生内存扩容时,会发生拷贝数据的现象,影响程序运行的效率,如果可以,要先分配好指定的容量
5、关于拷贝,可以把string拷贝成[]byte,不能把[]byte拷贝成string 。
【go语言中切片如何作参数 go 切片append】关于go语言中切片如何作参数和go 切片append的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。
推荐阅读
- jquery中文版,jquery 中文
- 下载迷你.,下载迷你世界恐龙版本
- 区块链技术趋势存储,区块链存储的技术
- 浩方cs服务器,浩方平台cs设置路径不对
- python反函数精度 python怎么求反三角函数
- 怎么把电脑u盘启动,如何使电脑u盘启动
- unity3.0游戏开发,unity游戏开发技术详解与典型案例
- 关于经营军舰游戏,关于经营军舰游戏的电影
- linux写入网口命令 linux给网口配地址