interviewer:说一说slice

interviewee: 主要包括以下几点

  1. slice and array
  2. slice的底层数据结构
  3. length和capacity

    切片的capacity的计算规则
  4. 扩容
  5. Reslicing
  6. SliceHeader: slice的运行时表示
  7. 可以指定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

[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的更多相关文章

  1. js基础查漏补缺(更新)

    js基础查漏补缺: 1. NaN != NaN: 复制数组可以用slice: 数组的sort.reverse等方法都会改变自身: Map是一组键值对的结构,Set是key的集合: Array.Map. ...

  2. 《CSS权威指南》基础复习+查漏补缺

    前几天被朋友问到几个CSS问题,讲道理么,接触CSS是从大一开始的,也算有3年半了,总是觉得自己对css算是熟悉的了.然而还是被几个问题弄的"一脸懵逼"... 然后又是刚入职新公司 ...

  3. Entity Framework 查漏补缺 (一)

    明确EF建立的数据库和对象之间的关系 EF也是一种ORM技术框架, 将对象模型和关系型数据库的数据结构对应起来,开发人员不在利用sql去操作数据相关结构和数据.以下是EF建立的数据库和对象之间关系 关 ...

  4. 2019Java查漏补缺(一)

    看到一个总结的知识: 感觉很全面的知识梳理,自己在github上总结了计算机网络笔记就很累了,猜想思维导图的方式一定花费了作者很大的精力,特共享出来.原文:java基础思维导图 自己学习的查漏补缺如下 ...

  5. 20165223 week1测试查漏补缺

    week1查漏补缺 经过第一周的学习后,在蓝墨云班课上做了一套31道题的小测试,下面是对测试题中遇到的错误的分析和总结: 一.背记题 不属于Java后继技术的是? Ptyhon Java后继技术有? ...

  6. 今天開始慢下脚步,開始ios技术知识的查漏补缺。

    从2014.6.30 開始工作算起. 如今已经是第416天了.不止不觉.时间过的真快. 通过对之前工作的总结.发现,你的知识面.会决定你面对问题时的态度.过程和结果. 简单来讲.知识面拓展了,你才干有 ...

  7. Mysql查漏补缺笔记

    目录 查漏补缺笔记2019/05/19 文件格式后缀 丢失修改,脏读,不可重复读 超键,候选键,主键 构S(Stmcture)/完整性I(Integrity)/数据操纵M(Malippulation) ...

  8. 【spring源码分析】IOC容器初始化——查漏补缺(四)

    前言:在前几篇查漏补缺中,其实我们已经涉及到bean生命周期了,本篇内容进行详细分析. 首先看bean实例化过程: 分析: bean实例化开始后 注入对象属性后(前面IOC初始化十几篇文章). 检查激 ...

  9. Django 查漏补缺

    Django 查漏补缺 Django  内容回顾: 一. Http 请求本质: 网络传输,运用socket Django程序: socket 服务端 a. 服务端监听IP和端口 b. 浏览器发送请求 ...

随机推荐

  1. 小杨排队(dp)

    链接:https://ac.nowcoder.com/acm/contest/3667/J 题目描述 小阳想要买个东西,然后就去了商店,发现进商店需要排队(生意太火爆!),然后就开始漫长的等待,他觉得 ...

  2. php源码加密--screw plus

    screw plus是一个开源的php扩展,作用是对php文件进行加密,网络上提供php加密的服务很多,但大多都只是混淆级别的加密,被人拿到加密文件问只要有足够耐心就能破解,与之不同的是,screw ...

  3. 12306 selenium 模拟登录

    # 下面是12306 实现的模拟登陆 # 解码 应用超级鹰,注册用户,左侧栏软件ID进去,开启一个新软件,拿到软件ID # 下面测试都在jupyter里面实现 # 超级鹰类 cell import r ...

  4. 获取 python linux Home目录

    #! /usr/bin/python # -*- coding: utf-8 -*- import os print os.environ['HOME'] print os.path.expandva ...

  5. 线段树——I hate it

    [问题描述]     很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感.    不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模 ...

  6. Newtonsoft.Json小记

    /*json相关*/ //http://www.cnblogs.com/hongfei/p/3593936.html string jsonObject = "{\"phone\& ...

  7. 吴裕雄--天生自然Numpy库学习笔记:NumPy 线性代数

    import numpy.matlib import numpy as np a = np.array([[1,2],[3,4]]) b = np.array([[11,12],[13,14]]) p ...

  8. 关于vscode的配置

    Git插件 通过GitLens -- Git supercharged可以很方便的查看历史作者 Setting.json(谨慎使用,因为对import进行排序改变后可能导致类的循环引用,因此不要轻易改 ...

  9. 洛谷P1144最短路计数

    题目描述 给出一个NNN个顶点MMM条边的无向无权图,顶点编号为1−N1-N1−N.问从顶点111开始,到其他每个点的最短路有几条. 输入格式 第一行包含222个正整数N,MN,MN,M,为图的顶点数 ...

  10. Java语言特性、加载与执行

    [开源.免费.纯面向对象.跨平台] 简单性: 相对而言,例如,Java是不支持多继承的,C++是支持多继承的,多继承比较复杂:C++ 有指针,Java屏蔽了指针的概念.所以相对来说Java是简单的. ...