字面量声明: slice := []int{ 10, 20, 30}
make声明: slice := make([]string, 5) 长度5容量5, slice := make([]string, 5, 8) 长度5容量8
使用索引声明: slice := []int{10, 20, 33, 50, 99}
newSlice := slice[1:3]
newSlice2 := slice[1:3:4] 第三个书表明容量位置
切片记录数据指针,长度,容量
数据指针指向实际底层数据内容
伪代码:
type slice struct{
len int
cap int
data *byte
}
使用切片创建的切片底层共享内容,对切片的修改会影响多个切片,这回引起诡异的bug,而且很难追踪。新切片声明时可以限制容量和长度一样,这样在第一次append的时候就可以强制创建新的底层数组,实现与原切片的分离。
slice := []int{10, 20, 33, 50, 99}
newSlice := slice[1:3:3] // 长度容量一致
newSlice = append(newSlice, 80) // append时开辟新空间,实现分离
和stl的vector实现一样,切片容量不够时,会开辟2倍容量的新切片,然后执行内容复制。当切片容量大于1000时,会开辟1.25倍容量的新切片。
长度容量都是0,指针nil
slice := make([]int, 0)
slice := []int{}
对容量是k的切片slice[i:j]
长度: j - i
容量: k - 1
for index, value := range slice
index返回索引,value返回值的copy副本,不是引用。
切片以值的方式传递,但是底层数据是同一份。
和数组不同,数组在函数参数中传递时,会复制整份数据。
所以传数组效率低,传切片效率高。
映射是无序的,即使使用同样的顺序保存键值对,每次迭代的时候,顺序也可能不同。
映射使用散列函数,将散列键分散到不同的桶中,在桶中存储数据。每次查找线hash到对应的桶中,再进行搜索。
dict := map[string] int {"red": 1, "name": 12 }
value, exists := colors["blue"]
if exists{
// do some to value
}
当key不存在时,返回的value是相应的空值