Go xmas2020 学习笔记 10、Slices in Detail
课程地址 go-class-slides/xmas-2020 at trunk · matt4biz/go-class-slides (github.com)
主讲老师 Matt Holiday
10-Slices in Detail
Slice
package main
import "fmt"
func main() {
var s []int
t := []int{}
u := make([]int, 5)
v := make([]int, 0, 5)
fmt.Printf("%d, %d, %T, %5t %#[3]v\n", len(s), cap(s), s, s == nil)
fmt.Printf("%d, %d, %T, %5t %#[3]v\n", len(t), cap(t), t, t == nil)
fmt.Printf("%d, %d, %T, %5t %#[3]v\n", len(u), cap(u), u, u == nil)
fmt.Printf("%d, %d, %T, %5t %#[3]v\n", len(v), cap(v), v, v == nil)
}
0, 0, []int, true []int(nil)
0, 0, []int, false []int{}
5, 5, []int, false []int{0, 0, 0, 0, 0}
0, 5, []int, false []int{}
\(t\) 中的 \(addr\) 指向一个起哨兵作用的结构,所以我们知道它是空的而不是 \(nil\).
可以用 append
方法生成元素存储地址,并返回一个描述符引用这个存储给 \(s\) . 即便 \(s\) 为 \(nil\)
Empty vs nil slice
使用 \(nil\) 、\(empty\) 映射替换切片在这个例子中分别是 null、{ } 。
判断切片是否为空不能使用 a == nil
,因为有 \(nil\)、\(empty\) 两种情况,应该用 len(a)
进行判断。
最好make
切片的时候给定 length
,否则新建同长度容量的切片用append
会将元素追加在一堆0的后面。
Important
package main
import "fmt"
func main() {
a := [3]int{1, 2, 3}
b := a[:1]
fmt.Println("a = ", a)
fmt.Println("b = ", b)
c := b[0:2]
fmt.Println("c = ", c)
fmt.Println(len(b))
fmt.Println(cap(b))
fmt.Println(len(c))
fmt.Println(cap(c))
d := a[0:1:1]
// e := d[0:2]
fmt.Println("d = ", d)
// fmt.Println("e = ", e) Error
fmt.Println(len(d))
fmt.Println(cap(d))
}
a = [1 2 3]
b = [1]
c = [1 2]
1
3
2
3
d = [1]
1
2
对截取的切片再次进行切片是根据原先的底层数组来的。
如果你使用两个索引切片符,你得到的切片的容量等于底层数组的容量。
package main
import "fmt"
func main() {
a := [3]int{1, 2, 3}
b := a[:1]
// c := b[0:2]
c := b[0:2:2]
fmt.Printf("a[%p] = %v\n", &a, a)
fmt.Printf("b[%p] = %v\n", b, b)
fmt.Printf("c[%p] = %v\n", c, c)
c = append(c, 5)
fmt.Printf("a[%p] = %v\n", &a, a)
fmt.Printf("c[%p] = %v\n", c, c)
c[0] = 9
fmt.Printf("a[%p] = %v\n", &a, a)
fmt.Printf("c[%p] = %v\n", c, c)
}
a[0xc000010150] = [1 2 3]
b[0xc000010150] = [1]
c[0xc000010150] = [1 2]
a[0xc000010150] = [1 2 3]
c[0xc00000e2a0] = [1 2 5]
a[0xc000010150] = [1 2 3]
c[0xc00000e2a0] = [9 2 5]
\(a\) 是一个数组,\(b、c\) 是两个切片,它们指向 \(a\)。
对 \(c\) 添加元素,会发现 \(a、c\) 被改变。\(c\) 的容量为 \(3\),长度为 \(2\),对 \(c\) 添加元素的时候把 \(a\) 修改了,覆盖 \(a\) 的第三个值。
对 \(c\) 限制容量数量,再添加元素会导致没有地方放置,所以会重新分配一块容量更大的内存区域,拷贝原先的元素,再把新加的元素放进去,底层数组地址发生改变。
去掉 \(a\),将 \(b\) 声明为切片并初始化,\(b\) 描述符指向无命名的底层数组。用 \(c\) 对其切片,并添加元素,结果和上面是一样的。切片实际上是一些底层数组的别名。
Go xmas2020 学习笔记 10、Slices in Detail的更多相关文章
- (转)live555学习笔记10-h264 RTP传输详解(2)
参考: 1,live555学习笔记10-h264 RTP传输详解(2) http://blog.csdn.net/niu_gao/article/details/6936108 2,H264 sps ...
- thinkphp学习笔记10—看不懂的路由规则
原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...
- 《C++ Primer Plus》学习笔记10
<C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...
- SQL反模式学习笔记10 取整错误
目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...
- golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息
golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...
- Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息
</pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...
- Hadoop学习笔记(10) ——搭建源码学习环境
Hadoop学习笔记(10) ——搭建源码学习环境 上一章中,我们对整个hadoop的目录及源码目录有了一个初步的了解,接下来计划深入学习一下这头神象作品了.但是看代码用什么,难不成gedit?,单步 ...
- APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause
转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...
- SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传
SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传 配置CKEDITOR 精简文件 解压之后可以看到ckeditor/lang下面有很多语言的js,如果不需要那么多种语言的,可 ...
随机推荐
- java实现下载网络图片
package com.gylhaut.picture;import java.io.*;import java.net.MalformedURLException;import java.net.U ...
- async-validator 源码学习笔记(三):rule
系列文章: 1.async-validator 源码学习(一):文档翻译 2.async-validator 源码学习笔记(二):目录结构 rule 主要实现的是校验规则,文件结构为下图: 一.rul ...
- OpenCV基础_二
阈值和平滑处理 cv2.threshold()二值化函数 ret,thresh = cv2.threshold(src, thresh, maxval, type[, dst]) 参数 src:所要进 ...
- 统计&分析 EXCEL:count、counta、countblank、countif和countifs函数分享
一.count 计算区域中包含数字的单元格的个数以及参数列表中的数字的个数. 利用函数COUNT可以计算单元格区域或数字数组中数字字段的输入项个数. 示例: 1.我要是写成=COUNT(B1,D1), ...
- Monkey的参数及简单使用
什么是Monkey? Monkey是Android SDK提供的一个命令行工具,可以简单方便的发送伪随机的用户事件流,对Android APP做压力(稳定性)测试.主要是为了测试app是否存在无响应和 ...
- react中使用截图组件Cropper组件
--最近项目用react,学习react并使用cropper组件裁剪图片. (这里开发组件不够统一有用tsx(TypeScript + xml/html)写的组件,有用jsx(javascript+x ...
- vue学习过程总结(04) - 菜鸟教程归纳
1.组件 组件(component)是vue.js最强大的功能之一.组件可以扩展html元素,封装可重用的代码.组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象 ...
- 使用MEF应用IOC(依赖倒置)
MVC实用架构设计(二)--使用MEF应用IOC(依赖倒置) 前言 在<上篇>中,基本的项目结构已经搭建起来了,但是有个问题,层与层之间虽然使用了接口进行隔离,但实例化接口的时候,还引 ...
- libpcap -学习1
1.今天学到的最重要一点就是指定是否打开混杂模式(Promiscuous Mode),0表示非混杂模式,任何其他值表示混合模式.如果要打开混杂模式,那么网卡必须也要打开混杂模式,可以使用如下的命令打开 ...
- 假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以 某个固定的已知的前缀开头的,如果将它们全部找出来?
使用 keys 指令可以扫出指定模式的 key 列表. 对方接着追问:如果这个 redis 正在给线上的业务提供服务,那使用 keys 指令会 有什么问题? 这个时候你要回答 redis 关键的一个特 ...