Go语言数组与切片

数组:

创建数组,需要指定数组元素的个数,且数组的容量不可变:

var array [3]int

若不指定个数,则为创建切片;

除此之外,还可以使用初始值列表创建数组,此时,使用'…',Go语言将会根据初始化时数组元素的数量确定数组的长度:

var array = [...]int{1,2,3,4}

此外涉及到的内容:在函数间传递数组(使用指针)

切片:

切片具有的特征:长度len(),容量cap(),追加append() // append为可变参数,即可追加多个元素

使用make创建:

slice := make([]string, 5)    // 长度容量都为5的切片

slice := make([]string, 3, 5)    // 长度为3,容量为5的切片,在创建时容量不可小于长度

不指定元素个数,则为创建切片:

slice := []int{10, 20, 30}

使用索引来声明切片:

slice := []int{3: 10}    // slice 索引为3的位置的值为10

nil切片与空切片:

var slice1 []int    // slice1 == nil    true

slice2 := make([]int, 0)    // slice2 == nil    false

其余属性均表现相同
  • 使用切片创建切片:

slice := []int{10, 20, 30, 40, 50}    // 长度容量均为5

newSlice := slice[1:3]    // [20, 30]    容量为4

新切片中保存的是原始切片中元素的引用,当newSlice中对某值做修改时,将会影响原切片。

若想不影响切片后面的其他元素,可以使用第三个参数(第三个参数的含义为限制新切片的容量,该数值不能大于原切片的容量,也就是说新切片的容量不能大于原切片的可用容量):

newSlice := slice[1:3:3]    // [20, 30]    容量为2

    slice := []int{10, 20, 30, 40, 50}

    newSlice := slice[1:3:3]

    newSlice = append(newSlice, 100)    // 此处调用append将会重新为newSlice分配空间,此时将会拷贝原始切片的元素到新的存储单元中,而不再是对原始切片中数据的引用,此处涉及到的【append的实现规则】

    fmt.Println(newSlice)

    newSlice[0] = 0

    fmt.Println(newSlice, slice)

输出:

[20 30 100]
[0 30 100] [10 20 30 40 50]

长度和容量的计算规则:

对底层数组容量是k 的切片slice[i:j]来说
长度: j - i
容量: k - i

此外涉及到的内容,在函数间传递切片(此时只传递切片,而不涉及到底层数组的拷贝与传递)

map的创建和初始化:

dict := make(map[string]int)

dict := map[string]string{"Red":"#da1337","Orange":"#e95a22"}

需要注意的是:切片、函数以及包含切片的结构类型这些类型由于具有引用语义,不能作为映射的键。

函数j间传递map和切片时,并不会赋值底层的数据结构,都会以很小的成本来赋值。

此条目发表在go分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注