跳转至

Go 切片

约 305 个字 42 行代码 预计阅读时间 2 分钟

创建

元素类型为 T 的切片:

[]T

切片可包含任何类型,甚至其他切片。

零值为nil

[]{1,2,3}

若以没有长度的数组的形式定义一个变量,则会创建对应的数组,然后构建引用它的切片。

1
2
3
4
make([]切片数据类型, 长度, 可选容量)
// eg.
make([]int, 5)
make([]int, 0, 5)

分配一个元素为零值的数组,并返回一个运用了它的切片。

确定

// 包含a中下标为1~3的元素
a[1:4]

通过两个下标(上界和下界)确定:a[low, high],包括下界,不包括上界。

1
2
3
4
5
6
var a[10]int
//以下切片等价
a[0:10]
a[:10]
a[0:]
a[:]

下界默认值为 0,上界默认值为切片长度。

属于对数组的引用

更改切片内元素会更改对应数组的对应元素,共享底层数组的切片也会受影响。

长度

切片包含的元素个数:

len(s)

容量

从切片第一个元素起,到其底层数组的元素末尾的个数:

cap(s)

扩展

若舍弃后面的值,可以通过重新切片来扩展:

1
2
3
4
s := []int{2, 3, 5, 7, 11, 13}    // len=6 cap=6 [2 3 5 7 11 13]
s = s[:0]    // len=0 cap=6 []
s = s[:4]    // len=4 cap=6 [2 3 5 7]
s = s[2:]    // len=2 cap=4 [5 7]

nil切片的长度和容量

nil 切片的长度和容量为 0,无底层数组。

向切片追加元素

追加到原切片末尾:

1
2
3
4
5
append(元素类型为T的切片, 元素,元素, ...)
// eg. 
append(s, 0)
append(s, 2, 3, 4)
append(s, a...)

返回包含原切片所有元素加上新添加元素的切片。以长度为准。

练习

package main
import (
    "golang.org/x/tour/pic"
    "math"
)
func Pic(dx, dy int) [][]uint8 {
    pic := make([][]uint8, dy)
    for y := range pic {
        pic[y] = make([]uint8, dx)
        for x := range pic[y] {
            pic[y][x] = uint8(float64(x) * math.Log(float64(y)))
        }
    }
    return pic
}
func main() {
    pic.Show(Pic)
}

来源

https://tour.go-zh.org/moretypes/18