7.1 创建数组

创建:

var identifier [len]type

自动判断长度:

a := [...]string{"a", "b", "c", "d"}

初始化指定位置:

var arrKeyValue = [5]string{3: "Chris", 4: "Ron"}

将数组作为参数:

func search(arr []int, val int){

}

7.2 切片(Slice)

切片(slice)是对数组一个连续片段的引用

切片的长度永远不会超过它的容量 (cap (s)

取数组的切片:arr [start_index:end_index]

arr [:]  // 整个的切片(类似指针)
arr [1:] // 从第 2 个元素开始的数组
arr [:3] // 从第 0 个元素到第 4 个元素

创建切片:

var slice1 [] type = make ([] type, len, cap) //cap 可选

new () 和 make () 的区别

new 创建指针,用于值类型

make 不但分配内存,还进行内存初始化,用于切片、map 和 channel。

通过 buffer 串联字符串

var buffer bytes.Buffer
for {
	if s, ok := getNextString(); ok { //method getNextString() not shown here
		buffer.WriteString(s)
	} else {
		break
	}
}
fmt.Print(buffer.String(), "\n")

Slice3(带容量限制的切片)

用法:a [i:j:k],其中 k 表示切片的容量。

7.3 遍历数组和切片

for idx, value := range slice1 {
	...
}

value 只是值的拷贝,若要访问引用,需要用索引:

package main

import "fmt"

func main() {
	var slice1 []int = make([]int, 4)

	slice1[0] = 1
	slice1[1] = 2
	slice1[2] = 3
	slice1[3] = 4
	for ix := range slice1 {
		slice1[ix] *= 2
	}
	for ix, value := range slice1 {
		fmt.Printf("Slice at %d is: %d\n", ix, value)
	}
}

/**
Output: 
Slice at 0 is: 2
Slice at 1 is: 4
Slice at 2 is: 6
Slice at 3 is: 8
*/

7.4 切片重组

切片在达到容量上限后可以扩容:

sl = sl[0:len(sl)+1]

但是不能超过关联数组的容量。

7.5 切片的复制与追加

如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。

	sl3 := []int{1, 2, 3}
	sl3 = append(sl3, 4, 5, 6)

如果 s 的容量不足以存储新增元素,append 会分配新的切片来保证已有切片元素和新增元素的存储。因此,返回的切片可能已经指向一个不同的相关数组了

如果切片最终只使用了一小部分,但是占据容量过大,可以通过 copy 使占据的内存回收。