Go语言中底层数组和切片的关系以及数组扩容规则

demo

package main

import (
"fmt"
) func main() {
// 声明一个底层数组,长度为10,容量为10
arr := []int {0,1,2,3,4,5,6,7,8,9}
fmt.Printf("[%T]len(arr)=%d,cap(arr)=%d \n",arr,len(arr),cap(arr))
// 声明两个切片,分别取底层数组的[1,4],[7:]
s1 := arr[1:4]
fmt.Printf("[%T]len(s1)=%d,cap(s1)=%d \n",s1,len(s1),cap(s1))
s2 := arr[7:]
fmt.Printf("[%T]len(s2)=%d,cap(s2)=%d \n",s2,len(s2),cap(s2))
// 数组越界指的是超出数组长度,例如下面报:panic: runtime error: index out of range [3] with length 3
//fmt.Println(s1[3])
// s1可以添加元素,添加后s1长度变大,容量不变,同时底层数组被修改
s1 = append(s1, 20)
fmt.Printf("[%T]len(s1)=%d,cap(s1)=%d \n",s1,len(s1),cap(s1))
fmt.Println(arr)
// s2如果需要添加元素,因为容量不够,需要进行扩容,开辟新数组,将原来的7,8,9拷贝过来,再添加一个20,长度为4,容量为6
s2 = append(s2,20)
fmt.Printf("[%T]len(s2)=%d,cap(s2)=%d \n",s2,len(s2),cap(s2))
// 此时修改s2的数组,底层数组arr不再受影响
s2[1] = 10
fmt.Println(arr) // 容量为什么为6?涉及到数组的扩容规则,举个例子如下:
ints := []int{1,2} // 原容量oldCap =2
ints = append(ints,3,4,5) // 预估容量cap = 5
/*
if oldCap * 2 < cap {
newCap = cap
} else {
if oldLen < 1024 {
newCap = oldCap *2
}else if oldLen >= 1024 {
newCap = oldCap *1.25
}
}
*/
// 上面例子中newCap = 5,int数组所占字节为5*8 = 40,但go语言向内存管理模块向操作系统申请的内存容量却没有40大小的,只有48符合,于是newCap = 48/8 = 6
// go语言内存管理模块是16bytes叠加的,8,16,32,48,64,80,96
// 参考博客:https://www.cnblogs.com/ldaniel/p/8502867.html?utm_source=debugrun&utm_medium=referral
fmt.Printf("[%T]len(ints)=%d,cap(ints)=%d \n",ints,len(ints),cap(ints))
// 例子验证第二种情况
ints2 := []int{1,2}
ints2 = append(ints2,3)
// 此时oldCap * 2 > cap ,满足第二种情况,newCap = 4
fmt.Printf("[%T]len(ints2)=%d,cap(ints2)=%d \n",ints2,len(ints2),cap(ints2))
}

打印输出参考

[[]int]len(arr)=10,cap(arr)=10
[[]int]len(s1)=3,cap(s1)=9
[[]int]len(s2)=3,cap(s2)=3
[[]int]len(s1)=4,cap(s1)=9
[0 1 2 3 20 5 6 7 8 9]
[[]int]len(s2)=4,cap(s2)=6
[0 1 2 3 20 5 6 7 8 9]
[[]int]len(ints)=5,cap(ints)=6
[[]int]len(ints2)=3,cap(ints2)=4 Process finished with exit code 0

Go语言中底层数组和切片的关系以及数组扩容规则的更多相关文章

  1. cpu的控制单元与语言中的控制逻辑有没有关系?

    cpu的控制单元与语言中的控制逻辑有没有关系?

  2. PHP语言中使用JSON和将json还原成数组

    从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码. 一.json_encode() 1 2 3 4 <?php $arr = ...

  3. 在PHP语言中使用JSON和将json还原成数组

    在之前我写过php返回json数据简单实例,刚刚上网,突然发现一篇文章,也是介绍json的,还挺详细,值得参考.内容如下 从5.2版本开始,PHP原生提供json_encode()和json_deco ...

  4. ***在PHP语言中使用JSON和将json还原成数组(json_decode()的常见错误)

    在之前我写过php返回json数据简单实例,刚刚上网,突然发现一篇文章,也是介绍json的,还挺详细,值得参考.内容如下 从5.2版本开始,PHP原生提供json_encode()和json_deco ...

  5. 转载:在PHP语言中使用JSON和将json还原成数组

    一.json_encode() 1 2 3 4 <?php $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); e ...

  6. GO语言总结(3)——数组和切片

    上篇博文简单介绍了一下Go语言的基本类型——GO语言总结(2)——基本类型,本篇博文开始介绍Go语言的数组和切片. 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. ( ...

  7. Go语言中的切片(十)

    go中数组的长度是固定的,且不同长度的数组是不同类型,这样的限制带来不少局限性.于是切片就来了,切片(Slice)是一个拥有相同类型元素的可变长度的序列.它是基于数组类型做的一层封装.它非常灵活,支持 ...

  8. C++基础 (8) 第八天 数组指针 模板指针 C语言中的多态 模板函数

    1昨日回顾 2 多态的练习-圆的图形 3多态的练习-程序员薪资 4员工管理案例-抽象类和技术员工的实现 employee.h: employee.cpp: technician.h: technici ...

  9. Go - 数组 和 切片(array、slice)

    一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建 数组有 3 种创建方式: 1) [length]Type 2) [length]Type{value ...

随机推荐

  1. algorithm库介绍之---- stable_sort()方法 与 sort()方法 .

    文章转载自:http://www.cnblogs.com/ffhajbq/archive/2012/07/24/2607476.html 关于stable_sort()和sort()的区别: 你发现有 ...

  2. alpine安装网络工具

    telnet:busybox-extras net-tools: net-tools tcpdump: tcpdump wget: wget dig nslookup: bind-tools curl ...

  3. [bug] jupyter notebook:服务在阿里云上启动,本地浏览器无法访问

    问题 在阿里云上装了个jupyter,服务正常启动了,但网页上无法访问 排查 安全组已经设置过了,7777端口 在宝塔面板查看,发现7777端口并没有开,打开就可以访问了 原来阿里云的安全组和防火墙是 ...

  4. [bug] Linux下执行.sh命令出现-bash: ./bin/start.sh: /bin/bash^M: bad interpreter: No such file or directory

    参考 https://www.cnblogs.com/aeolian/p/10614284.html

  5. Linux 系统运行着许多子系统和应用程序。您可以使用系统日志记录从启动时就收集有关运行中系统的数据。有时

    概述 在本教程中,您将学习以下内容: 配置 syslog 守护程序 了解标准设施.优先级和操作 配置日志轮换 了解 rsyslog 和 syslog-ng 系统内部发生了什么 Linux 系统运行着许 ...

  6. 强哥CSS学习笔记

    html嵌套css样式:1.外部(推荐)2.内部3.内联(不推荐) css优先级1.内联2.id选择器3.class选择器4.标签 css长度单位:1.px2.em (14px) css选择器:常用选 ...

  7. SystemVerilog 编写FSM

    SystemVerilog 编写FSM 题目 SystemVerilog实现 仿真 SystemVerilog 编写FSM 好书: https://github.com/yllinux/blogPic ...

  8. CentOS 7系统启动后怎么从命令行模式切换到图形界面模式

    CentOS 7系统启动后怎么从命令行模式切换到图形界面模式原创传智播客官方博客 最后发布于2020-04-08 15:44:43 阅读数 88 收藏展开一.存在问题 在VMware虚拟机中成功安装c ...

  9. centos7 连接打印机

    centos7 连接打印机 2017-08-07 15:05:33 五岳寻仙客 阅读数 2531更多 分类专栏: Liunx的日常使用   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版 ...

  10. 聊聊 Spring 的 XML Schema 扩展机制的使用方式

    前言 在当前Java生态,Spring算的上是最核心的框架,所有的开发组件想要得到大范围更便捷的使用,都要和Spring进行整合,比如我们熟知的Mybatis.Dubbo等,以及内部封装的各类组件包括 ...