Overview

  • array

底层指向数组的指针,是一块连续的空间

  • len

大小

  • cap

容量

New slice

image-20190409112312727

mallocgc

Dilatation

slice比较有意思的是扩容阶段,slice到底是以怎样的方式进行扩容的呢?

主要逻辑在growslice函数

注: 主要关键的两个逻辑:所需容量小于1024,2^N;大于1024,1/4缓慢递增,直至能容纳所需容量的大小

Example

往上看到了一个比较有意思的例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import "fmt"

func main() {
	s := []int{5}
	fmt.Println("s1:", len(s), cap(s))
	s = append(s, 7)
	fmt.Println("s2:", len(s), cap(s))
	s = append(s, 9)
	fmt.Println("s3:", len(s), cap(s))
	x := append(s, 11)
	fmt.Println("x-->", x)
	fmt.Println("sx:", len(s), cap(s))
	fmt.Println("x:", len(x), cap(x))
	y := append(s, 12)
	fmt.Println("sy:", len(s), cap(s))
	fmt.Println("y-->", y)
	fmt.Println(s, x, y)
  fmt.Printf("s:%p, x:%p, y:%p\n", s, x, y)
}

输出:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
s1: 1 1
s2: 2 2
s3: 3 4
x--> [5 7 9 11]
sx: 3 4
x: 4 4
sy: 3 4
y--> [5 7 9 12]
[5 7 9] [5 7 9 12] [5 7 9 12]
s:0xc000018200, x:0xc000018200, y:0xc000018200

Why?

image-20190409120804468

深入理解 Go Slice