go 语言切片要点

切片声明

  1.  字面量声明: slice := []int{ 10, 20, 30}

  2. make声明: slice := make([]string, 5)  长度5容量5, slice := make([]string, 5, 8) 长度5容量8

  3. 使用索引声明: slice := []int{10, 20, 33, 50, 99}

newSlice := slice[1:3]

newSlice2 := slice[1:3:4] 第三个书表明容量位置


切片中有2部分组成

  • 切片记录数据指针,长度,容量

  • 数据指针指向实际底层数据内容

伪代码:

type slice struct{

len int

cap int

data *byte

}


使用切片创建的切片,共享底层内容,修改对2个切片都起作用

使用切片创建的切片底层共享内容,对切片的修改会影响多个切片,这回引起诡异的bug,而且很难追踪。新切片声明时可以限制容量和长度一样,这样在第一次append的时候就可以强制创建新的底层数组,实现与原切片的分离。

slice := []int{10, 20, 33, 50, 99}

newSlice := slice[1:3:3] // 长度容量一致

newSlice = append(newSlice, 80) // append时开辟新空间,实现分离


容量自动扩充是2倍

和stl的vector实现一样,切片容量不够时,会开辟2倍容量的新切片,然后执行内容复制。当切片容量大于1000时,会开辟1.25倍容量的新切片。

空切片

长度容量都是0,指针nil

slice := make([]int, 0)

slice := []int{}


切片长度容量计算

对容量是k的切片slice[i:j]

长度: j - i

容量:   k - 1


range遍历切片

for index, value := range slice

index返回索引,value返回值的copy副本,不是引用


切片在函数中的传递

切片以值的方式传递,但是底层数据是同一份

和数组不同,数组在函数参数中传递时,会复制整份数据

所以传数组效率低,传切片效率高。


映射

映射是无序的,即使使用同样的顺序保存键值对,每次迭代的时候,顺序也可能不同。


映射查找效率高

映射使用散列函数,将散列键分散到不同的桶中,在桶中存储数据。每次查找线hash到对应的桶中,再进行搜索。

映射声明

dict := map[string] int {"red": 1, "name": 12 }


切片,函数,包含切片的结构类型不能作为key


映射使用

value, exists := colors["blue"]

if exists{

// do some to value

}

当key不存在时,返回的value是相应的空值


映射在函数中以引用方式传递

你可能感兴趣的:(go,go,切片)