Golang的数组、切片、映射的理解
1、数组
go的数组是值类型,赋值和传参操作都会复制整个数组数据,因此一般使用指针在函数间传递大数组。
如果数组长度不确定,可以使用 ... 代替数组的长度,编译器会根据元素个数自行推断数组的长度:balance := [...]float32{},同时还可以通过指定下标来初始化元素。
2、切片
引用类型,创建的变量被称作标头( header)值,标头值里包含一个指针,指向底层数据结构,因此通过复制传递一个引用类型的值的副本时(go语言中所有都是值传递),本质上是传递指针,还是共享底层的数据结构。
Go 中切片其实可以看作是对数组的抽象,Go中数组的长度不可改变,Go中提供了一种功能强悍的切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。切片不需要说明长度,[] 表示是切片类型。
切片由3个字段组成:指向底层数组首地址的指针、切片的长度、切片的容量(即允许增长到的元素个数也是底层数组的长度)。
// 使用make 创建空的整型切片
slice := make([]int, 0)
// 使用切片字面量创建空的整型切片,初始的长度和容量会基于初始化时提供的元素的个数确定。
slice := []int{}
2.1、append扩容:append 会首先使用可用容量(长度小于容量的部分),没有可用容量了才会分配一个新的底层数组即一个包含修改结果的新切片。又因为切片赋值或截取的切片会共享同一个底层数组,对切片进行修改后,就很可能会导致不同的结果(原先赋值的变量或截取的切片还是指向之前的地层结构,而扩容后指向了新的底层数组,导致不一致),因此建议设置切片长度和容量相等,这样每次append都会返回一个新的切片。
返回的新切片按以下规则进行扩容:在切片的容量小于1000 个元素时,总是会成倍地增加容量。一旦元素个数超过1000,容量的增长因子会设为1.25,也就是会每次增加25%的容量。
a := make([]int, 5)
b := a[0:4]
a = append(a, 1)
a[1] = 5
fmt.Println(b)
// [0 0 0 0]
fmt.Println(a)
// [0 5 0 0 0 1]
//由于 a 的长度超出了容量,所以切片 a 指向了一个增长后的新数组,而 b 仍然指向原来的老数组。
//所以之后对 a 进行的操作,对 b 不会产生影响。
3、映射
引用类型,创建的变量被称作标头( header)值,标头值里包含一个指针,指向底层数据结构,因此通过复制传递一个引用类型的值的副本时,本质上是传递指针,还是共享底层的数据结构。
dict := make(map[string]int)
dict := map[string]int{}
映射底层使用两个数据结构来存储数据。
第一个数据结构是一个数组,数组存储的是键的散列值的高八位值,用于选择键值对存储在哪个对应的桶。
第二个数据结构是一个字节数组(对应一个逻辑上的桶),用于存储整个键值对,该字节数组先依次存储了这个桶里所有的键,之后依次存储了这个桶里所有的值,目的在于减少每个桶所需的内存。
映射的键可以是任何值。这个值的类型可以是内置的类型,也可以是结构类型,只要这个值可以使用==运算符做比较。但是切片、映射、函数以及包含切片的结构类型这些类型由于具有引用语义,不能作为映射的键。
在golang中,通过键来索引映射时,即便这个键不存在也总会返回一个值。在这种情况下,返回的是该值对应的类型的零值。
Golang的数组、切片、映射的理解相关推荐
- golang 判断 数组 切片 是否为空
实例: package mainfunc main() {// 数组arr := [0]int{}if len(arr) == 0 {println(`这是个空数组`)}// 切片slice := m ...
- Golang 基本类型数组切片 拼成 字符串 方法
1.对于字符串型数组切片 import "fmt"func main() {s:=[]string{"1","3","jjj&qu ...
- python数组切片教程_手把手numpy教程【二】——数组与切片
今天是Numpy专题的第二篇,我们来进入正题,来看看Numpy的运算. 上一篇文章当中曾经提到过,同样大小的数据,使用Numpy的运算速度会是我们自己写循环来计算的上百倍甚至更多.并且Numpy的AP ...
- Golang二维切片初始化
本文主要介绍Golang二维切片初始化的实现 引言 之前,刷Leetcode的时候,有些题需要初始化二维数组,而一维数组的初始化,比如: var a = [5]int{1, 2, 3, 4, 5} / ...
- A01_[NumPy中文网]数组基础(创建数组,多维数组切片,数组属性)、使用数组(基本操作符,数组特殊运算符)、索引(花式索引,布尔索引,缺省索引)
NumPy简单入门教程 NumPy是Python中的一个运算速度非常快的一个数学库,它非常重视数组.它允许你在Python中进行向量和矩阵计算,并且由于许多底层函数实际上是用C编写的,因此你可以体验在 ...
- golang 包含 数组_Golang数组类型
数组 数组是指一系列同一类型数据的集合.数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度. 1. 声明方法 [32]byte //长度为32的数组 [2*N ...
- golang中的切片及内存拷贝
十分钟讲明白, golang, Go 语言切片(Slice) 2017年08月21日 16:39:21 kingmax54212008 阅读数:8782 https://blog.csdn.net/k ...
- Golang如何遍历切片slice
前言 这两天用golang开发一个把企业微信的打卡记录同步到HR-OA系统的一个中间表的功能,同步时把从企业微信接口里查询到的打卡记录放到一个对象的切片里,然后遍历切片把每条打卡记录写到中间表,这里涉 ...
- Python中数组切片的用法详解
Python中数组切片的用法详解 一.python中"::-1"代表什么? 二.python中":"的用法 三.python中数组切片 三.numpy中的整数数 ...
- Golang学习——数组指针和指针数组的区别
Golang中数组指针和指针数组区别 一.数组指针 1.语法 2.实例 3.通过指针访问数组 二.指针数组 1.语法 2.实例 区别二者,字面上只看 后两个字即可: 数组指针 :它是一个指针,但是数据 ...
最新文章
- 第二十九课.回声状态网络ESN
- 独家 | 手把手教你用Python进行Web抓取(附代码)
- cv2.dnn读取模型报错
- maven java 目录结构_java – 为maven目录结构生成的源文件的位置
- 安全研究剖析:******方式演示
- TensorFlow学习笔记(十七)tf.nn.conv2d
- linux mint 图标主题_如何在 Linux Mint 中更换主题
- U3D 平行光阴影细节 Directional Shadow Details
- chrome 无法抓屏的问题
- 神奇的go语言(image网站开发)
- 不好的女人只能消耗你,好的女人不仅可以给你一个家和孩子
- PyTorch学习—16.PyTorch中hook函数
- 性能,不是不重要,而是,它没有可维护性重要
- 使用爬虫自动登录QQ空间
- 小学计算机网络安全考试试卷,2017年小学生网络安全知识竞赛试题
- MMA8451Q传感器读值
- java远程连接linux并发送命令,两种方案比较Jsch与ganymed-ssh2
- python开头声明_python开头——文件声明 详解
- 【LTE】LTE基础知识要点(二)信道物理资源定义(RG/RB/RE/REG)
- 高效运维的本质:可视化的服务交付和可视化的服务度量
热门文章
- UE3客户端加入DS过程
- [NOI2014]动物园 【kmp】
- LINUX_egrep及扩展正则表达式
- 安装完毕freebsd的后续工作,安全设置及其他(适合新手)
- Feedback about (Blockchain OR ML) AND (logistics)
- no Bloomberg, wind, ceic, csmar at cambridge
- feedback from waic
- eye caring sticker
- 《守望先锋》阵亡镜头、全场最佳和亮眼表现是如何设计
- 二维费用 hdu 2159 FATE(完全背包)HDU OJ 4501 小明系列故事——买年货【DP】