切片
slice
是拥有相同类型元素可变长的序列,是基于数组类型做的一层封装,支持扩容。
01 定义切片
01 一般方法
package main
import "fmt"
func main(){
var a []int
fmt.Println(a)
}
注意:
这种只声明,没有初始化,等于nil
02 数组切分
package main
import "fmt"
func main(){
a := [9]int {1, 2, 3, 4}
b := a[:] // b 是一个切片
fmt.Println(a, b)
}
注意:
切片切分还是切片
初始化为空时,长度和容量为0,但是不等于nil
03 make函数
package main
import "fmt"
func main(){
a := make([]int, 3, 5) // 类型、长度、容量(可以省略,与长度一致)
fmt.Println(a)
}
注意:
长度容量为0时,不等于nil
切片的长度是len()
,切片容量是cap()
02 切片用法
01 len
长度:就是元素的个数
package main
import "fmt"
func main(){
a := [9]int {1, 2, 3, 4}
b := a[:5] // b 是一个切片
fmt.Println(len(b)) // 就是元素个数
}
02 cap
容量
package main
import "fmt"
func main(){
a := [9]int {1, 2, 3, 4}
b := a[:5] // b 是一个切片
fmt.Println(cap(b)) // 在这里是数组的长度
}
注意:
1 如果是普通声明赋值的切片,容量和长度相等
2 如果是切分数组获得切片,容量不扩容的情况下,容量等于数组长度,减去切分的最小索引
3 如果是make函数声明定义的切片,在不扩容的情况下,第三个参数是容量,如果省略,那么等于长度(第二个参数)
03 append
给切片添加元素,加在最后(右)
- 加单个元素
package main
import "fmt"
func main(){
a := make([]int, 5)
a = append(a, 1) // 必须有变量接收,一般是添加元素的切片
fmt.Println(a)
}
注意:
1 只声明不能用append方法,要初始化
2 添加的元素大于切片容量,切片会自动扩容
- 加多个元素
package main
import "fmt"
func main(){
a := make([]int, 5)
a = append(a, 1, 2, 3) // 必须有变量接收,一般是添加元素的切片
fmt.Println(a)
}
- 两个切片元素相加
package main
import "fmt"
func main(){
a := make([]int, 5)
b := []int{33, 34, 35}
a = append(a, b...) // 必须有三个点
fmt.Println(a)
}
注意:
只能是切片,不能是数组
04 删除切片中的元素
没有内置方法
package main
import "fmt"
func main(){
a := []int{1, 2, 3, 4, 5, 6, 7}
a = append(a[1[:3], a[4:]...]) // 删除了索引为3的元素
fmt.Println(a)
}
注意:
删除索引为n的元素,直接append(a[:n], a[n+1: ]...)
05 切片是引用赋值
切片被引用赋值,被赋值的切片发生改变,原切片也会发生变化
package main
import "fmt"
func main(){
a := []int{1, 2, 3, 4, 5, 6, 7}
b := a
b[3] == 1000
fmt.Println(a, b) // a,b 都发生变化
}
06 使用copy()复制切片
复制的切片发生变化,原切片不发生改变
package main
import "fmt"
func main(){
a := []int{1, 2, 3, 4, 5, 6, 7}
b := make([]int, 7)
copy(b, a)
b[3] = 1000
fmt.Println(a, b) // 只有b发生改变
}
注意:
要想被copy复制,只能用make声明初始化切片
07 遍历
与数组一样
package main
import "fmt"
func main(){
a := []int {12, 13, 14, 15, 16, 17, 18}
// for range 遍历
for _, value := range a{
fmt.Println(value)
}
// 二
for i := 0; i < len(a); i ++{
fmt.Println(a[i])
}
}