1、Go的切片概念
切片与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大,所以可以将切片理解成“动态数组”,但是,它不是数组。
2、切片的基本写法
package main
import "fmt"
func main() {
var s []int
fmt.Println(len(s))
s2 := []int{}
fmt.Println(len(s2))
//make(切片类型,长度,容量)
//长度是已经初始化的空间。容量是已经开辟的空间,包括已经初始化的空间和空闲的空间。
s3 := make([]int, 3, 5)
fmt.Println(s3)
fmt.Println("s3 长度 len = ", len(s3))
fmt.Println("s3 容量 cap = ", cap(s3))
}
输出结果:
0
0
[0 0 0]
s3 长度 len = 3
s3 容量 cap = 5
3、切片初始化
package main
import "fmt"
func main() {
var s []int // s := []int {1, 2, 3, 4, 5}
s = append(s, 1, 2, 3, 4, 5)
s[3] = 77
s = append(s, 6, 7, 8)
fmt.Println(s)
s2 := make([]int, 3, 10)
s2[0] = 10
s2[1] = 11
s2[2] = 12
//s2[3] = 13 //会造成下标越界
s2 = append(s2, 80)
s2[3] = 13
fmt.Println(s2)
}
输出结果:
[1 2 3 77 5 6 7 8]
[10 11 12 13]
4、切片的截取
代码
package main
import "fmt"
func main() {
s := []int{3, 5, 6, 7, 8, 9}
//第一个值:截取的起始位置
//第二个值:截取的终止位置(不包含该值的)
//第三个值:用来计算容量,容量指的是切片中最多能够容纳多少元素。
//容量=第三个值减去第一个值。
//长度=第二个值减去第一个值
s1 := s[0:3:5]
fmt.Println("s1 == ", s1)
fmt.Println("s1 len ==", len(s1))
fmt.Println("s1 cap ==", cap(s1))
s2 := s[3:]
fmt.Println("s2 == ", s2)
s3 := s[:3]
fmt.Println("s3 == ", s3)
s4 := s[1:3]
fmt.Println("s4 == ", s4)
}
输出结果:
s1 == [3 5 6]
s1 len == 3
s1 cap == 5
s2 == [7 8 9]
s3 == [3 5 6]
s4 == [5 6]
注意:切片截取后返回新切片,对新切片的值进行修改,会影响原切片
5、append函数使用
package main
import "fmt"
func main() {
s := make([]int, 5, 8)
s = append(s, 1)
s = append(s, 2)
s = append(s, 3)
s = append(s, 4)
fmt.Println("len =", len(s))
//切片扩容:一般扩容方式为上一次:容量*2,如果超过1024字节每次扩容上一次的1/4
fmt.Println("cap =", cap(s))
fmt.Println(s)
}
输出结果:
len = 9
cap = 16
[0 0 0 0 0 1 2 3 4]
6、copy函数使用
package main
import "fmt"
func main() {
s1 := []int{1, 2}
s2 := []int{3, 4, 5, 6, 7}
copy(s1, s2)
fmt.Println("s1 = ", s1)
}
输出结果为:
s1 = [3 4]
7、切片的排序
package main
import "fmt"
func main() {
var slice []int = []int{9, 1, 5, 6, 8, 3, 7, 2, 10, 4}
for i := 0; i < len(slice)-1; i++ {
for j := 0; j < len(slice)-1-i; j++ {
if slice[j] > slice[j+1] {
slice[j], slice[j+1] = slice[j+1], slice[j]
}
}
}
fmt.Println(slice)
}
输出结果为:
[1 2 3 4 5 6 7 8 9 10]