09-slice

// 切片是Go中的关键数据类型,为序列提供了比数组更强大的接口。

package main

import "fmt"

func main() {
	// 与数组不同,切片的类型由它包含的元素(而不是元素数量)决定,使用内置的make函数创建长度非零的空切片
	s := make([]string, 3) // 在这里创建一个长度为3的空的字符串切片,其中默认零值为空字符串
	fmt.Println("emp:", s)

	s[0] = "a"
	s[1] = "b"
	s[2] = "c"
	// 可以像数组那样设置和获取切片的值
	fmt.Println("set:", s)
	fmt.Println("get:", s[2])

	fmt.Println("len:", len(s)) // len函数返回切片的长度

	// 除了上面的基本操作,切片还有更多其他操作,使得它比数组更丰富
	s = append(s, "d")      // 内置函数append返回包含一个或多个新值的切片
	s = append(s, "e", "f") // 需要接收来自append函数的返回值,因为可能会得到一个新的切片
	fmt.Println("apd:", s)

	c := make([]string, len(s)) // 创建一个与s长度相同的空的切片c用于存储s的拷贝
	copy(c, s)                  // 切片也可以被拷贝
	fmt.Println("cpy:", c)

	// 切片支持slice[low:high]语法的切片操作
	l := s[2:5] // 得到包含元素s[2],s[3]和s[4]的切片
	fmt.Println("sl1:", l)

	l = s[2:] //从s[2]开始到结尾
	fmt.Println("sl2:", l)

	l = s[:5] //从头开始到s[5]结束
	fmt.Println("sl3:", l)

	t := []string{"g", "h", "i"} // 可以在一行中声明并初始化一个切片变量
	fmt.Println("dcl:", t)

	twoD := make([][]int, 3) // 切片可以被组合成多维数据结构
	for i := 0; i < 3; i++ {
		innerLen := i + 1
		twoD[i] = make([]int, innerLen) // 内部切片的长度是可变的,这与多维数组不同
		for j := 0; j < innerLen; j++ {
			twoD[i][j] = i + j
		}
	}
	fmt.Println("2d", twoD)
}

// 注意,虽然切片的类型与数组不同,但是在fmt.Println中的输出形式是相似的

// Go语言团队在切片设计与实现中的更对细节https://blog.golang.org/go-slices-usage-and-internals
上次修改: 10 January 2020