课程地址 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的更多相关文章

  1. (转)live555学习笔记10-h264 RTP传输详解(2)

    参考: 1,live555学习笔记10-h264 RTP传输详解(2) http://blog.csdn.net/niu_gao/article/details/6936108 2,H264 sps ...

  2. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  3. 《C++ Primer Plus》学习笔记10

    <C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...

  4. SQL反模式学习笔记10 取整错误

    目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...

  5. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  6. Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息

    </pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...

  7. Hadoop学习笔记(10) ——搭建源码学习环境

    Hadoop学习笔记(10) ——搭建源码学习环境 上一章中,我们对整个hadoop的目录及源码目录有了一个初步的了解,接下来计划深入学习一下这头神象作品了.但是看代码用什么,难不成gedit?,单步 ...

  8. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

  9. SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传

    SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传 配置CKEDITOR 精简文件 解压之后可以看到ckeditor/lang下面有很多语言的js,如果不需要那么多种语言的,可 ...

随机推荐

  1. 使用ntp 实现时间同步

    1.首先安装NTP [root@localhost /]# yum install ntp -y2.查看是否安装成功 rpm -qa|grep ntp [root@hadoop102 桌面]# vi ...

  2. Kubernetes:Ingress总结(二)

    Blog:博客园 个人 参考:Ingress | Kubernetes.<Kubernetes进阶实战> Contour是Kubernetes Ingress控制器的另一款开源实现,它以高 ...

  3. CF786B/CF787D Legacy

    题目描述: luogu cf cf 题解: 最短路+线段树优化建图. 考虑本题的边是点->点.段->点和点->段,我们可以建线段树然后拆成入点和出点. 入点:儿子->父亲,边权 ...

  4. iOS全埋点解决方案-应用退出和启动

    前言 ​ 通过应用程序退出事件,可以分析应用程序的平均使用时长:通过应用程序的启动事件,可以分析日活和新增.我们可以通过全埋点方式 SDK 实现应用程序的退出和启动事件. 一.全埋点的简介 ​ 目前. ...

  5. 半吊子菜鸟学Web开发4 --Html css学习2

    1<a>标签,链接到另一个页面 <a href="目标网址" title="鼠标滑过显示的文本">链接显示的文本</a> H ...

  6. java 学习笔记(一)

    书 head first java 1. 2.加强版的FOR循环 3. 通过super引用父类 4.多态 5.接口和抽象类 接口 6.多线程锁 7.JDBC

  7. Postman请求报错:Error:getaddrinfo ENOENT 50.88.88.88

    一.问题来源 今天发布一个新开发的项目到通州现场,内容是开放几个接口给第三方调用,需要现场部署的同事使用postman调用测试一下,现场同事使用postman调用后反馈有如下错误: 二.解决方法 发现 ...

  8. SpringBoot bean映射yml中的属性举例

    pom:导入配置文件处理器,配置文件进行绑定就会有提示 <dependency> <groupId>org.springframework.boot</groupId&g ...

  9. @Component, @Controller, @Repository, @Service 有何区别?

    @Component :这将 java 类标记为 bean.它是任何 Spring 管理组件的通 用构造型.spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境 中. @Controll ...

  10. 百度移动统计调用api教程,少进坑(82001错误)

    相信很多小伙伴使用了百度统计,来查看自己应用使用的情况,但是会发现百度移动统计在官网没有api调用取数据的接口, 现在我就以自己成功调用api并且成功拿到数据,将这个步骤给大家参考,(末尾有调用移动统 ...