GO Slices: 用法与原理
GO Slices: 用法与原理
此文是golang blog的笔记,原文地址 https://blog.golang.org/go-slices-usage-and-internals
Introduction
golang的slice类型提供了对类型数据的顺序操作。Slices与其他语言中的array概念类似,但有其不同之处。
Arrays
一个Array类型定义了长度与元素的数据类型。它的长度是固定的,可以通过序号被索引。
var a [4]int
a[0] = 1
i := a[0]
// i == 1
Golang中array是值,一个array变量表示整个数组,而不是像C中表示一个指向第一个元素的指针。
Slices
array虽然会被用到,但是有点不太灵活,所以在GO代码中出现的比较少。Slices则几乎到处出现。一个slice表示为[]T,T是元素类型。Slice的长度是不固定的。
Slice可以被make
函数创建,例如:
func make([]T, len, cap) []T
var s []byte
s = make([]byte, 5, 5)
// s == []byte{0, 0, 0, 0, 0}
Slice的长度和容量可以由函数len()
, cap()
获取。
Slice的初始值是nil,此时len
,cap
返回0。Slice可以用半开区间来表示。
b := []byte{'g', 'o', 'l', 'a', 'n', 'g'}
// b[1:4] == []byte{'o', 'l', 'a'}, sharing the same storage as b
一个Slice描述符有一个指向数组的指针,长度,容量三个部分组成。切片不会拷贝数据,只是创建了一个新的slice,其中指针指向原始数据。