查漏补缺之slice
interviewer:说一说slice
interviewee: 主要包括以下几点
- slice and array
- slice的底层数据结构
- length和capacity
切片的capacity的计算规则 - 扩容
- Reslicing
- SliceHeader: slice的运行时表示
- 可以指定capacity的reslicing
1. slice and array
slice的底层存储是array,而slice只是描述底层数组的某个片段的范围,并不会实际存储数据。
2. slice的底层数据结构
A slice is a descriptor of an array segment. It consists of a pointer to the array, the length of the segment, and its capacity (the maximum length of the segment).
3. length和capacity
某个切片的capacity的计算规则
某个切片的capacity = 底层数组的cap - 该切片的prt指针在底层数组中的位置

参考附录[Re-slicing slices in Golang]
4. 扩容
- 小于1024个元素时,2倍增长; >=1024个元素时,1.25倍增长。
这个结论是不完全正确的,没有考虑到字节对齐,具体请参考附录[深度解密Go语言之Slice]
5. Reslicing
5.1 Reslicing的几个简单例子
5.2 Reslicnig过程中,length和capacity的变化 [手绘笔记]

6. SliceHeader: slice的运行时表示
https://play.golang.org/p/aKSZlVGGTpL
package main
import (
"fmt"
"reflect"
"unsafe"
)
func main() {
a := []byte{1, 2, 3}
// cut slice
printSlice("a", a)
printSlice("a[0:]", a[0:])
printSlice("a[1:]", a[1:])
// extend slice from a[:1] to a[1:2]
printSlice("a[:0]", a[:0])
printSlice("a[:0][:2]", a[:0][:2]) // 最开始我不理解,为什么a[:0]有0个元素,却可从中取出2个元素,后来知道了extend slice操作后才理解.
printSlice("a[:2]", a[:2])
}
func printSlice(s string, arr []byte) {
sliceHeader := (*reflect.SliceHeader)((unsafe.Pointer(&arr)))
fmt.Printf("%s %+v %v\n", s, sliceHeader, arr)
}
// output 4251681-4251680 = 1byte,说明底层数组的prt指针指向了下一个byte.
//a &{Data:4251680 Len:3 Cap:3} [1 2 3]
//a[0:] &{Data:4251680 Len:3 Cap:3} [1 2 3]
//a[1:] &{Data:4251681 Len:2 Cap:2} [2 3]
//a[:0] &{Data:4251680 Len:0 Cap:3} []
//a[:0][:2] &{Data:4251680 Len:2 Cap:3} [1 2]
//a[:2] &{Data:4251680 Len:2 Cap:3} [1 2] // 可以看出a[:0][:2]和a[:2]的结果是一样的.
7.可以指定capacity的reslicing
slice[low : high : max],具体参考[Re-slicing slices in Golang回答2] 和 [Slice expressions,Full slice expressions]
参考资料
[Re-slicing slices in Golang回答2] (https://stackoverflow.com/a/18911267/7689674)
Slice expressions,Full slice expressions
Go Slices: usage and internals
深度解密Go语言之Slice 这是滴滴的饶大佬写的,从非常底层的角度分析的,建议预留整块时间来看。
查漏补缺之slice的更多相关文章
- js基础查漏补缺(更新)
js基础查漏补缺: 1. NaN != NaN: 复制数组可以用slice: 数组的sort.reverse等方法都会改变自身: Map是一组键值对的结构,Set是key的集合: Array.Map. ...
- 《CSS权威指南》基础复习+查漏补缺
前几天被朋友问到几个CSS问题,讲道理么,接触CSS是从大一开始的,也算有3年半了,总是觉得自己对css算是熟悉的了.然而还是被几个问题弄的"一脸懵逼"... 然后又是刚入职新公司 ...
- Entity Framework 查漏补缺 (一)
明确EF建立的数据库和对象之间的关系 EF也是一种ORM技术框架, 将对象模型和关系型数据库的数据结构对应起来,开发人员不在利用sql去操作数据相关结构和数据.以下是EF建立的数据库和对象之间关系 关 ...
- 2019Java查漏补缺(一)
看到一个总结的知识: 感觉很全面的知识梳理,自己在github上总结了计算机网络笔记就很累了,猜想思维导图的方式一定花费了作者很大的精力,特共享出来.原文:java基础思维导图 自己学习的查漏补缺如下 ...
- 20165223 week1测试查漏补缺
week1查漏补缺 经过第一周的学习后,在蓝墨云班课上做了一套31道题的小测试,下面是对测试题中遇到的错误的分析和总结: 一.背记题 不属于Java后继技术的是? Ptyhon Java后继技术有? ...
- 今天開始慢下脚步,開始ios技术知识的查漏补缺。
从2014.6.30 開始工作算起. 如今已经是第416天了.不止不觉.时间过的真快. 通过对之前工作的总结.发现,你的知识面.会决定你面对问题时的态度.过程和结果. 简单来讲.知识面拓展了,你才干有 ...
- Mysql查漏补缺笔记
目录 查漏补缺笔记2019/05/19 文件格式后缀 丢失修改,脏读,不可重复读 超键,候选键,主键 构S(Stmcture)/完整性I(Integrity)/数据操纵M(Malippulation) ...
- 【spring源码分析】IOC容器初始化——查漏补缺(四)
前言:在前几篇查漏补缺中,其实我们已经涉及到bean生命周期了,本篇内容进行详细分析. 首先看bean实例化过程: 分析: bean实例化开始后 注入对象属性后(前面IOC初始化十几篇文章). 检查激 ...
- Django 查漏补缺
Django 查漏补缺 Django 内容回顾: 一. Http 请求本质: 网络传输,运用socket Django程序: socket 服务端 a. 服务端监听IP和端口 b. 浏览器发送请求 ...
随机推荐
- 黑帽JS跳转
一.常规的JS页面跳转代码 .在原来的窗体中直接跳转用 <script type=”text/javascript”> window.location.href=”http://www.g ...
- 【嵌入式】ARM9复习
一.嵌入式系统基础 二.ARM处理器 1. 在每条指令后,用;//注释这条指令的寻址方式,以及实现的功能(25分) 注:变址寻址需要标注是基址加偏移.还是基址加索引,是前变址还是后变址.SUB SP, ...
- 解决安装 fireworks、photoshop 时卡在输入账号、手机号处等问题
一定要断网! 一定要断网! 一定要断网! 重要的事情说三遍! 我安装的是破解版CS6系列: 安装步骤如下: 1.当进行安装到此步时,(前面的步骤为解压文件等便不解释),选择“试用”,此时应该是 断网 ...
- python学习之HTML
1.HTML初知 <!DOCTYPE html> <html lang="en"> <head> html头 <meta charset= ...
- ASP.NET(C#) Json序列化反序列化帮助类Jsonhelper
原文地址:https://ken.io/note/csharp-asp.net-jsonhelper using System; using System.Collections.Generic; u ...
- Pycharm 分屏
有图由真相 效果自在眼前
- 创业学习--《预判行业机会》--B-2.预判模块---HHR计划--以太一堂
一,<开始学习> 1,行业机会的判断,是可以通过不断地训练提高自己的判准的概率的,要科学思考创业. 2,创业者在行业机会上的三个问题: a. 对市场变化,敏感性太弱,没有洞察行业的意识. ...
- java 生成签名文件
如何使用jdk中的keytool.exe生成一个签名文件? 1.通过命令行cmd进入jdk的bin目录下,会发现有一个keytool.exe文件 执行命令:keytool -genkey -alias ...
- jquery发送请求的各种方法
地址链接:https://www.cnblogs.com/java-dyb/p/10910566.html 关于向服务器传递数据的一些补充: json字符串与json对象之间的转换: JSON.par ...
- ES6-使用模板字符串完成字符串拼接
var obj = {name:'tom',age:11}; //es5的字符串拼接比较麻烦 var str = '姓名是:'+obj.name+' '+'年龄是:'+obj. ...