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,此时lencap返回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,其中指针指向原始数据。

原文地址:https://www.cnblogs.com/birdhack/p/6576066.html