查漏补缺之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. 浏览器发送请求 ...
随机推荐
- Airflow 操作知识总结(完善中)
airflow默认以utc时区运行,如果需要计算正确的时间,需要把时间进行时区转换,核心代码如下 #将本地时间转换为utc时间,再设置为start_date tz = pytz.timezone('A ...
- docker安装后启动报错
docker安装后启动不起来: 查看日志 /var/log/message 其中有一行为: Your kernel does not support cgroup memory limit ...
- PS——牛奶字
一.新建800*600像素的背景,设置前景色到透明渐变(黑到白),线性渐变,从上到下画一条直线 二.用矩形选框工具在背景上方1/2位置画一个矩形,Ctrl+Delete填充颜色 三.输入文字,设置图层 ...
- SaaS paas iaas是什么
saas:软件即服务,必须对云服务商的定价及合同 条款进行仔细审查保证其安全性,如果存在纠纷云商切断服务话企业可能立马面临困境. paas:平台即服务 iaas :基础架构即服务.
- 【C语言】创建一个函数,并调用比较两个数的大小
#include <stdio.h> int max(int x,int y) { if(x>=y) return x; else return y; } main() { int ...
- HDU 1241 Oil Deposits(经典DFS)
嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241 很经典的一道dfs,但是注意每次查到一个@之后,都要把它变成“ * ”,然后继续dfs ...
- Windows 搭建WAMP+Mantis
下载WAMP http://www.wampserver.com/ 安装直接下一步就行 安装完启动后,显示下面的logo 在浏览器输入 127.0.0.1/phpmyadmin 设置数据库(默认 ...
- Coursera-吴恩达机器学习课程笔记-Week4+5
Neural networks non-linear hypotheses 非线性假设 Neural model:logistic unit 第一层 Input layer 最后一层 Outer la ...
- java 生成签名文件
如何使用jdk中的keytool.exe生成一个签名文件? 1.通过命令行cmd进入jdk的bin目录下,会发现有一个keytool.exe文件 执行命令:keytool -genkey -alias ...
- 不是充许的静态以太网地址,它与vmware保留的mac地址冲突
不是充许的静态以太网地址,它与vmware保留的mac地址冲突 只需修改vxm文件即可. 第一部,打开vmw的镜像位置,如图. 点击后,打开硬盘,如下 把这个vmx结尾的文件下载,在本地编辑,可用tx ...