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)
}

浙公网安备 33010602011771号