golang中apend_golang的append()为什么不会影响slice的地址?
了解了 slice 的结构后,你就明白了。先来看看 slice 在源码中的结构,如下:
// runtime/slice.go
type slice struct {
array unsafe.Pointer // 数组指针
len int // 长度
cap int // 容量
}
slice,即切片,它主要包含三个信息,切片的开始位置(数组的地址),切片大小以及底层数组容量。
正因为切片的底层结构是数组,所以就可以直接基于数组创建切片,比如:
a := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s := a[1:6]
此时的切片结构是这样的,图示如下:
访问切片 s[0] 其实就是访问的 a[1] 位置,其实可以改变一下 s[0] 的值,就会发现 a[1] 的值也跟着改变了。
s[0] = 10
fmt.Println(a[1])
输出的结果是 10。
切片的长度和底层结构的容量分别可以通过 len 和 cap 获得。
fmt.Println(len(s)) // 6
fmt.Println(cap(s)) // 8
如果底层结构的数组容量足够,改变 slice 的 len 即可,slice 地址不会该干。
如果底层结构的数组容量不够,Go 会自动帮助创建新的数组,并将 s 指向新创建的数组,但是同样,slice 本身的地址并没有改变,只是改变了地址中的内容。
扩容基本是按需要的 2 倍容量申请,可以通过如下代码测试下,不断进行翻倍追加。
for i := 0; i < 10; i++ {
fmt.Println(cap(s))
s = append(s, s...)
}
终于完成连续 90 天答题成就,以后可以认真写回答了,不用再担心每天必须答一个问题了。
golang中apend_golang的append()为什么不会影响slice的地址?相关推荐
- golang中的空slice
golang中允许对值为 nil 的 slice 添加元素 package mainfunc main() {var s []ints = append(s, 1) } 运行成功
- golang中tcp socket粘包问题和处理
http://www.01happy.com/golang-tcp-socket-adhere/ 在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格 ...
- golang中builtin包说明
builtin包是go的预声明定义,包括go语言中常用的各种类型和方法声明,包括变量和常量两部分.其详细声明在builtin.go文件中,链接:http://golang.org/src/builti ...
- 七、golang中接口、反射
一.接口定义 1.定义 interface类型可以定义一组方法,但是这些不需要实现,并且interface不能包含任何变量 package mainimport ("fmt" )t ...
- Golang 中的大顶堆或小顶堆
Golang 中没有提供可直接使用的大顶堆或小顶堆,需要自己去实现 container/heap 包中的 heap.Interface 接口才能实现,具体如下. package mainimport ...
- Golang 中 Slice的分析与使用(含源码)
文章目录 1.slice结构体 2.slice初始化 3.append操作 4.slice截取 5.slice深拷贝 6.值传递还是引用传递 参考文献 众所周知,在golang中,slice(切片)是 ...
- Golang中的println和fmt.Println
Golang中常用于打印的是 fmt.Println,就是说要引用fmt包. Golang同时存在着一对println()和print().都是小写字符!记住!!(Golang严格区分大小写) 看起来 ...
- golang 中 map 排序
golang 中没有专门的 map 排序函数,且 map 默认是无序的,也就是你写入的顺序和打印的顺序是不一样的. m := make(map[string]string, 0) m["on ...
- golang中base64 md5 sha256的编解码及摘要算法、aes、des、sha1
golang中base64 md5 sha256的编解码及摘要算法.aes.rsa.des.sha1 golang中base64 md5 sha256的编解码及摘要算法 关于加密解密 AES DES ...
最新文章
- ANCOM:找出微生物群落中的差异物种
- hybriddb mysql移植_HybridDB for MySQL 实现在线与离线数据分离的实践
- 夺命雷公狗---微信开发57----微网站之jquery_mobile之入门案例
- python实例编程_python 编程实例 5
- 为什么使用lambda表达式
- mysql udf禁用_如何禁用 mysql 的 udf 功能
- ORACLE1.8-序列
- Spring与SpringBoot 学习笔记(1)
- 填报true\false和复选框应用及导出打印显示复
- java传智播客答案_传智播客_java基础入门习题答案.docx
- Qt+OpenCV配置教程(图解亲测)
- 三极管与恒流源电路(TI学习总结)
- 盘点:20位近两年新任“院士校长”!
- 一只公鸡5块钱,一只母鸡3块钱,3只小鸡一块钱,一个农夫用100块钱买100只鸡(不许解方程),怎么实现?编写java程序。...
- Android开发支付集成——微信集成
- Python Parser的用法
- KISSY基础篇乄KISSY之Event
- ServiceHot ITSM助力天原集团IT运维信息化建设
- 计算机教师继续教育心得,教师继续教育心得体会
- 电容的种类及特点与性能
热门文章
- linux 韦恩图两个,如何使用R来绘制韦恩图(Venn Diagram)
- java堆排序图解_108-堆排序的思路图解_清华毕业老程序员亲授通俗易懂的Java数据结构和算法​​​​教程_Java视频-51CTO学院...
- 【Java方法】从方法中返回多个值
- mysql三阶段提交实现_基于两阶段提交的分布式事务实现(UP-2PC)
- python canvas画弧度_超清字符画——Python代码
- 什么是Thymeleaf?
- 组装高性能服务器配置,高性能计算服务器参考配置需求.doc
- 光感是什么_华强北airpods2洛达1536U-001到底升级了什么?
- python plot 时间_python – 在matplotlib中绘制时间与日期
- hashmap原理_HashMap实现原理解读