go 速学 - 07 - Slice
来源:互联网 发布:14岁谈恋爱软件 编辑:程序博客网 时间:2024/05/18 02:26
目录
- 切片 Slice
- 概念
- 创建 Slice
- 定义切片
- 指定范围创建切片
- 使用 make 创建切片
- len和 cap
- 遍历
- Reslice
- Append
- 概念
- 使用
- Copy
- 切片 Slice
摘要
切片和数组的区别,创建切片,指定范围,make,遍历,reslice,append,copy
切片 Slice
概念
- 切片本身不是数组,而是指向底层的数组,关联数组的局部或全部
- 切片是引用类型
- 创建切片时索引不能超过数组的大小,否则会报异常
创建 Slice
定义切片
定义时不用指定长度(指定长度或使用 “…” 表示的是数组)
//切片var s []intfmt.Println(s) //[]//数组var arr [5]intfmt.Println(arr) //[0 0 0 0 0]
指定范围创建切片
单个索引
a := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}s1 := a[9] //s1 10
左闭右开
s2 := a[5:10] //s2 [6 7 8 9 10]
从指定索引开始(包含)
s3 := a[5:] //s3 [6 7 8 9 10]
到指定索引(不包含)
s4 := a[:5] //s4 [1 2 3 4 5]
使用 make 创建切片
格式
make([]T, len, cap)
make([]T, len)
创建时如果省略 cap,则表示和 len 相同
例
s5 := make([]int, 3, 10)
len()和 cap()
len()
获取元素个数,cap()
获取容量
len(s5)cap(s5)
遍历
for i, v := range w { fmt.Println(i, v)}
其中 i 为索引,如果想忽略 i 的使用可以使用占位符 “_”
//忽略值for i := range w { fmt.Print(i)}//忽略索引for _, v := range w { fmt.Print(v)}
Reslice
即指向 Slice 的 Slice
Reslice 时的索引以被 slice 的切片为准
w := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'}fmt.Println("w", w) //w [97 98 99 100 101 102 103 104 105 106 107]wa := w[2:5] //wa [99 100 101]wb := wa[3:5] //wb [102 103]
Append
概念
- 用于在 slice 尾部追加元素
- 如果最终长度未超过追加到 slice 的容量则返回原始 slice
- 如果超过以追加到的 slice 的容量则将重新分配数组并拷贝原始数据
- 当两个 slice 指向同一个数组时,如果其中一个 slice 超过了容量,那么再改变它不会影响到另一个 slice,因为此 slice 其实已经指向新的内存空间了
使用
语法
resultSlice:=append(originalSlice, ele1, ele2, ele3...)
n1 := make([]int, 3, 6)fmt.Println("n1", n1) //n1 [0 0 0]n2 := append(n1, 1, 2)fmt.Println("n1", n1) //n1 [0 0 0]fmt.Println("n2", n2, len(n2), cap(n2)) //n2 [0 0 0 1 2] 5 6//没有超过原slice 的容量,会影响其它slicen3 := append(n1, 3)fmt.Println("n1", n1) //n1 [0 0 0]fmt.Println("n2", n2) //n2 [0 0 0 3 2]fmt.Println("n3", n3) //n3 [0 0 0 3]n4 := append(n1, 4, 5, 6)fmt.Println("n1", n1) //n1 [0 0 0]fmt.Println("n2", n2) //n2 [0 0 0 4 5]fmt.Println("n3", n3) //n3 [0 0 0 4]fmt.Println("n4", n4) //n4 [0 0 0 4 5 6]//超过原slice 的容量,指向新地址,不会影响其它slicen5 := append(n1, 7, 8, 9, 10)fmt.Println("n1", n1) //n1 [0 0 0]fmt.Println("n2", n2) //n2 [0 0 0 4 5]fmt.Println("n3", n3) //n3 [0 0 0 4]fmt.Println("n4", n4) //n4 [0 0 0 4 5 6]fmt.Println("n5", n5) //n5 [0 0 0 7 8 9 10]
Copy
语法
copy(to,from)
a := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}c1 := a[2:5]c2 := a[5:8]fmt.Println("c1", c1) //c1 [3 4 5]fmt.Println("c2", c2) //c2 [6 7 8]copy(c1, c2)fmt.Println("c1", c1) //c1 [6 7 8]fmt.Println("c2", c2) //c2 [6 7 8]
目标切片的容量可以小于源切片的容量
c3 := a[2:3]c4 := a[3:9]fmt.Println("c3", c3) //c3 [6]fmt.Println("c4", c4) //c4 [7 8 6 7 8 9]copy(c3, c4)fmt.Println("c3", c3) //c3 [7]fmt.Println("c4", c4) //c4 [7 8 6 7 8 9]
0 0
- go 速学 - 07 - Slice
- go slice
- Go-Slice
- go slice
- 【Go】slice
- Go基础 - slice
- Go语言Slice操作.
- Go 语言切片(Slice)
- go slice与函数
- Go语言中的Slice
- go中的slice坑
- go map slice积累
- GO语言slice
- go的slice传参
- go slice坑
- Go语言切片(Slice)
- Go语言 --- slice切片
- 【go语言 slice】迭代slice
- 手机如何上网?3G如何建立TCT连接?3G如何建立HTTP连接?
- 学习java的好书及视频推荐[1]
- 日经春秋 20150403
- spring @Autowired注入失败
- 操作用户余额 Monxin专用(PHP代码函数)
- go 速学 - 07 - Slice
- STL string 用法介绍
- Python求多幅图像栅格值的平均值
- MySQL操作数据库基本操作
- 代码习惯问题记录
- FZU 2150 Fire Game(DFS+BFS)
- vim : 依赖: vim-common (= 2:7.3.429-2ubuntu2) 但是 2:7.3.429-2ubuntu2.1 正要被安装
- 日经社説 20150403 地域を越えた柔軟な送電網に
- WCF 、Web API 、 WCF REST 和 Web Service 的区别