数组 字符串 切片

这三种数据类型,在底层原始数据有着相同的内存结构

数组

数组的元素可以被修改,但是数组本身的赋值和函数传参都是以整体复制的方式处理的,数组的长度是数组类型的组成部分,不同长度或不同类型的数据组成的数组都是不同的类型

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
}

2021914163350

字符串切片

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)