数组 字符串 切片
这三种数据类型,在底层原始数据有着相同的内存结构
数组
数组的元素可以被修改,但是数组本身的赋值和函数传参都是以整体复制的方式处理的,数组的长度是数组类型的组成部分,不同长度或不同类型的数据组成的数组都是不同的类型
var a [3]int // 定义长度为3的int型数组, 元素全部为0
var b = [...]int{1, 2, 3} // 定义长度为3的int型数组, 元素为 1, 2, 3
var c = [...]int{2: 3, 1: 2} // 定义长度为3的int型数组, 元素为 0, 2, 3
var d = [...]int{1, 2, 4: 5, 6} // 定义长度为6的int型数组, 元素为 1, 2, 0, 0, 5, 6
数组的传递是通过值而非引用,可以定义一个指向数组,但不同长度数组的指针的类型也都各不相同
var b = &a
迭代
for i, v := range a {
fmt.Println(i, v)
}
空数组
长度为0的数组不会分配内存空间,可以用于强调某种特有类型的操作时避免分配额外的内存空间
字符串
字符串底层结构
type StringHeader struct {
Data uintptr
Len int
}
字符串切片
var s = "jntm"
fmt.Println(s[:2])
切片
结构:
type SliceHeader struct {
Data uintptr
Len int
Cap int
}
var (
a []int // nil切片, 和 nil 相等, 一般用来表示一个不存在的切片
b = []int{} // 空切片, 和 nil 不相等, 一般用来表示一个空的集合
c = []int{1, 2, 3} // 有3个元素的切片, len和cap都为3
d = c[:2] // 有2个元素的切片, len为2, cap为3
e = c[0:2:cap(c)] // 有2个元素的切片, len为2, cap为3
f = c[:0] // 有0个元素的切片, len为0, cap为3
g = make([]int, 3) // 有3个元素的切片, len和cap都为3
h = make([]int, 2, 3) // 有2个元素的切片, len为2, cap为3
i = make([]int, 0, 3) // 有0个元素的切片, len为0, cap为3
)
添加元素
c = append(c, 4)