数组概念
特点:
具有相同 唯一类型
一组已编号且长度固定
可以通过索引来读取或者修改
最大长度为 2Gb
声明格式
var identifier [len]typpe
例如:
var arr1 [5] int
var arr2 [10]string
在内存中的结构是:
每个元素是一个整型值,当声明数组时所有的元素都会被自动初始化为默认值 0。arr1 的长度是 5,索引范围从 0 到 len(arr1)-1。
对索引项为 i 的数组元素赋值可以这么操作:arr[i] = value,所以数组是 可变的。
- 通过 for 初始化数组项
- 通过 for 打印数组元素
- 通过 for 依次处理元素
package main
import "fmt"
func main() {
var arr1 [5]int
for i:=0; i < len(arr1); i ++ {
arr1[i] = i * 2
}
a := [...]string{
"a", "b", "c", "d"}
// i为索引
for i := range a {
fmt.Println("Array item", i, "is", a[i])
}
}
数组常量
- 第一种
var arrAge = [5]int{18, 20, 15, 22, 16}
注意 [5]int 可以从左边起开始忽略:[10]int {1, 2, 3} :这是一个有 10 个元素的数组,除了前三个元素外其他元素都为 0。
- 第二种
var arrLazy = [...]int{5, 6, 7, 8, 22}
- 第三种
var arrKeyValue = [5]string{3: "Chris", 4: "Ron"}
Person at 0 is
Person at 1 is
Person at 2 is
Person at 3 is Chris
Person at 4 is Ron
切片
切片(slice)是对数组一个连续片段的引用(该数组我们称之为相关数组,通常是匿名的),所以切片是一个引用类型(因此更类似于 C/C++ 中的数组类型,或者 Python 中的 list 类型)。
0 <= len(s) <= cap(s)
多个切片如果表示同一个数组的片段,它们可以共享数据;因此一个切片和相关数组的其他切片是共享存储的,相反,不同的数组总是代表不同的存储。数组实际上是切片的构建块。
优点 因为切片是引用,所以它们不需要使用额外的内存并且比使用数组更有效率,所以在 Go 代码中 切片比数组更常用。
声明切片的格式是: var identifier []type
(不需要说明长度)
一个由数字 1、2、3 组成的切片可以这么生成:s := [3]int{1,2,3}[:]
(注: 应先用s := [3]int{1, 2, 3}
生成数组, 再使用s[:]
转成切片) 甚至更简单的 s := []int{1,2,3}
切片在内存中的组织方式实际上是一个有 3 个域的结构体:指向相关数组的指针,切片长度以及切片容量。下图给出了一个长度为 2,容量为 4 的切片y。
y[0] = 3
且y[1] = 5
- 切片
y[0:4]
由 元素 3,5,7 和 11 组成
注意 绝对不要用指针指向 slice。切片本身已经是一个引用类型,所以它本身就是一个指针!!