go-切片slice
切片slice
- 其本身并不是数组,它指向底层的数组
- 作为边长数组的替代方案,可以关联底层数组的局部或全部
- 为引用类型
- 可以直接创建或从低产能数组获取生成
- 使用len()获取元素个数,cap()获取容量
- 一般使用make()创建
- 如果多个slice指向相同底层数组,其中一个的值改变会影响全部
- make([]type,len,cap)
- 其中cap可以省略,则和len相同
//第一种声明方式
package main import "fmt" func main() { var s1 []int //[]为指定size,则创建的是一个slice类型,并不是数组 fmt.Println(s1) //[]
a := [10]int{}
fmt.Println(a)
s2 := a[5:10] //切片方法与python类似
fmt.Println(s2) //[0 0 0 0 0]
}
//第二种声明方式
package main import "fmt" func main() { s1 := make([]int,3,10) //10表示数组容量,表示10个连续内存块,如果超过容量,容量会自动扩容2倍,会重新分配20个内存块 fmt.Println(s1,len(s1),cap(s1)) //[0 0 0] 3 10 }
slice与低产能数组的对应关系
package main import "fmt" func main() { a := []string{"a","b","c","d","e","f","g","h","i","j","k"} sa := a[2:5] fmt.Println(len(sa),cap(sa)) //3 9 sb := sa[1:3] //索引不能超过slice的cap值 fmt.Println(sb) }
注意:如果slice追加的元素超过slice容量,则内存地址发生变化,slice数组改变不再影响slice后的数组
Reslice
-
Reslice时索引以被slice的切片为准
-
索引不可以超过被slice的切片的容量cap()值
-
索引越界不会导致底层数组的重新分配而是引发错误
Append
- 可以在slice尾部追加元素
- 可以将一个slice追加在另一个slice尾部
- 如果最终长度未超过追加到slice的容量则返回原始slice
- 如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据
Copy
package main import "fmt" func main() { s1 := []int{1,2,3,4,5} s2 := []int{6,7,8} copy(s1,s2) //s2为被拷贝元素,以短的slice为准,s1可以通过[:]来指定copy到的放置位置 fmt.Println(s1) //[6 7 8 4 5] }
map
- 类似其他语言中的哈希表或者字典,以key-value形式存储数据
- key必须是支持==或!=比较运算的类型,不可以是函数、map或slice
- map查找比现行搜索快很多,但比使用索引访问数据的类型慢100倍
- Map使用make()创建,支持:=这种简写方式
- make([keyTyep]valueType,cap)cap表示容量,可省略
- 超出容量时会自动扩容,但尽量提供一个合理的初始值
- 使用len()获取元素个数
- 键值对不存在时会自动添加,使用delete()删除某键值对
- 使用for range对map或slice进行迭代操作
package main import ( "fmt" ) func main() { a := make(map[int]string) //map初始化 a[1] = "ok" //增加键值对 delete(a ,1) //删除键为1的键值对 fmt.Println(a) //map[1:ok] var m map[int]map[int]string //键值都需初始化 m = make(map[int]map[int]string) //对key初始化 m[1] = make(map[int]string) //对每一个value初始化 m[1][1] = "a" n,ok := m[2][1] if !ok { m[2] = make(map[int]string) } m[2][1] = "GOOD" n,ok = m[2][1] fmt.Println(n,ok) //GOOD true }
//迭代操作 package main import ( "fmt" "sort" //排序 ) func main() { s := [3]string{"a","b","c"} for i,v:= range s{ fmt.Println(i,v) //0 a //1 b //2 c } sm := make([]map[int]string,5) for i := range sm{ sm[i] = make(map[int]string,1) sm[i][1] = "ok" fmt.Println(sm[i]) } fmt.Println(sm) m := map[int]string{1:"a",2:"b",3:"c",4:"d",5:"e"} ss := make([]int,len(m)) i := 0 for k,_ := range m{ ss[i] = k i ++ } sort.Ints(ss) //排序 fmt.Println(ss) }