了解了 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的地址?相关推荐

  1. golang中的空slice

    golang中允许对值为 nil 的 slice 添加元素 package mainfunc main() {var s []ints = append(s, 1) } 运行成功

  2. golang中tcp socket粘包问题和处理

    http://www.01happy.com/golang-tcp-socket-adhere/ 在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格 ...

  3. golang中builtin包说明

    builtin包是go的预声明定义,包括go语言中常用的各种类型和方法声明,包括变量和常量两部分.其详细声明在builtin.go文件中,链接:http://golang.org/src/builti ...

  4. 七、golang中接口、反射

    一.接口定义 1.定义 interface类型可以定义一组方法,但是这些不需要实现,并且interface不能包含任何变量 package mainimport ("fmt" )t ...

  5. Golang 中的大顶堆或小顶堆

    Golang 中没有提供可直接使用的大顶堆或小顶堆,需要自己去实现 container/heap 包中的 heap.Interface 接口才能实现,具体如下. package mainimport ...

  6. Golang 中 Slice的分析与使用(含源码)

    文章目录 1.slice结构体 2.slice初始化 3.append操作 4.slice截取 5.slice深拷贝 6.值传递还是引用传递 参考文献 众所周知,在golang中,slice(切片)是 ...

  7. Golang中的println和fmt.Println

    Golang中常用于打印的是 fmt.Println,就是说要引用fmt包. Golang同时存在着一对println()和print().都是小写字符!记住!!(Golang严格区分大小写) 看起来 ...

  8. golang 中 map 排序

    golang 中没有专门的 map 排序函数,且 map 默认是无序的,也就是你写入的顺序和打印的顺序是不一样的. m := make(map[string]string, 0) m["on ...

  9. golang中base64 md5 sha256的编解码及摘要算法、aes、des、sha1

    golang中base64 md5 sha256的编解码及摘要算法.aes.rsa.des.sha1 golang中base64 md5 sha256的编解码及摘要算法 关于加密解密 AES DES ...

最新文章

  1. ANCOM:找出微生物群落中的差异物种
  2. hybriddb mysql移植_HybridDB for MySQL 实现在线与离线数据分离的实践
  3. 夺命雷公狗---微信开发57----微网站之jquery_mobile之入门案例
  4. python实例编程_python 编程实例 5
  5. 为什么使用lambda表达式
  6. mysql udf禁用_如何禁用 mysql 的 udf 功能
  7. ORACLE1.8-序列
  8. Spring与SpringBoot 学习笔记(1)
  9. 填报true\false和复选框应用及导出打印显示复
  10. java传智播客答案_传智播客_java基础入门习题答案.docx
  11. Qt+OpenCV配置教程(图解亲测)
  12. 三极管与恒流源电路(TI学习总结)
  13. 盘点:20位近两年新任“院士校长”!
  14. 一只公鸡5块钱,一只母鸡3块钱,3只小鸡一块钱,一个农夫用100块钱买100只鸡(不许解方程),怎么实现?编写java程序。...
  15. Android开发支付集成——微信集成
  16. Python Parser的用法
  17. KISSY基础篇乄KISSY之Event
  18. ServiceHot ITSM助力天原集团IT运维信息化建设
  19. 计算机教师继续教育心得,教师继续教育心得体会
  20. 电容的种类及特点与性能

热门文章

  1. linux 韦恩图两个,如何使用R来绘制韦恩图(Venn Diagram)
  2. java堆排序图解_108-堆排序的思路图解_清华毕业老程序员亲授通俗易懂的Java数据结构和算法​​​​教程_Java视频-51CTO学院...
  3. 【Java方法】从方法中返回多个值
  4. mysql三阶段提交实现_基于两阶段提交的分布式事务实现(UP-2PC)
  5. python canvas画弧度_超清字符画——Python代码
  6. 什么是Thymeleaf?
  7. 组装高性能服务器配置,高性能计算服务器参考配置需求.doc
  8. 光感是什么_华强北airpods2洛达1536U-001到底升级了什么?
  9. python plot 时间_python – 在matplotlib中绘制时间与日期
  10. hashmap原理_HashMap实现原理解读