切片
代码
//example.go
package test
import "fmt"
func Slice() {
//s1为切片类型
//切片本身是对数组的引用,因此切片是引用类型。
//如果对切片进行修改,那么他会影响原数组本身
//如果切片为空,值为nil
//切片的语法是左闭右开。
//如果将整个数组全部切片:我们可以有两种写法:
// 1. [0:len(array)]
// 2. [:]
//代表,如果从第一个位置开始切片,那么0可以省略
//如果切片到最后一个位置,那么len(array)也可以省略。
array := [5]int{1, 2, 3, 4, 5}
var s1 []int = array[1:4]
s1[0] = 0
fmt.Println("array = ", array) //对原数组产生了改变
s2 := s1[1:]
s2[0] = 0
fmt.Println("array = ", array) //原数组又发生了变化
var s3 []int
fmt.Println("does s3==nil?", s3 == nil)
//可以使用make来开辟一段内存空间,之后让切片指向它
//注意:切片的长度是它所包含的元素个数
//切片的容量是从它的第一个元素到其底层数组元素末尾的个数
//因此:切片的底层数组结构就是数组
//3,5代表:切片的元素个数为3,从切片的第一个元素开始,到其底层数组元素末尾的个数为5
s3 = make([]int, 3, 5) //make([]type,len,cap),cap可以省略,若省略则跟len相同
//可以使用len()和cap()来查看长度和容量
fmt.Printf("len(s3)=%v,cap(s3)=%v,s3=%v\n", len(s3), cap(s3), s3)
s4 := []int{1, 2, 3} //由系统自动创建底层数组
fmt.Println("s4=", s4)
//追加前的长度和容量
//len(s1)=3 cap(s1)=4
fmt.Printf("len(s1)=%v cap(s1)=%v\n", len(s1), cap(s1))
//追加元素
s1 = append(s1, 6, 7, 8) //底层会创建新的数组,不再引用原数组
s1[4] = 0
fmt.Println("array=", array) //array不再发生变化
fmt.Println("s1=", s1)
//追加之后,切片的长度和容量会发生变化
//len(s1)=6 cap(s1)=8
fmt.Printf("len(s1)=%v cap(s1)=%v\n", len(s1), cap(s1))
//切片还可以追加切片
//代表在s1的后面追加一个切片,...代表将切片拆开再添加
s5 := append(s1, s2...)
fmt.Println("s5=", s5) //s5= [0 0 4 6 0 8 0 4]
//复制数组
s6 := []int{1, 1}
// copy(s5, s6)
// fmt.Println("s5", s5) //s5 [1 1 4 6 0 8 0 4]
copy(s6, s5) //s6 [0 0]
fmt.Println("s6", s6)
fmt.Println("string与[]byte")
str := "hello world"
fmt.Printf("[]byte(str)=%v\n[]byte(str)=%s\n", []byte(str), []byte(str))
//遍历字符串
for i, v := range str {
fmt.Printf("下标:%v,值为:%v,值对应的字符:%c\n", i, v, v)
}
testFunction("hello", "world", "1", "2", "3", "etc")
}
//代表可以接收任意多个字符串
//text本质是一个切片
func testFunction(text ...string) {
fmt.Println("text = ", text) //text = [hello world 1 2 3 etc]
fmt.Println(len(text), cap(text)) //6 6
}
//main.go
package main
import "GoExample/test"
func main() {
test.Slice()
}
关于切片容量的扩容机制:
1. 当原切片长度小于 1024 时,新的切片长度直接加上 append 元素的个数,容量则会直接 *2
2. 当原切片长度大于等于 1024 时,新的切片长度直接加上 append 元素的个数,容量则会增加 1/4
参考文献:
https://juejin.cn/post/7159748785176838181
本博客参考自:
https://www.bilibili.com/video/BV1s341147US/?spm_id_from=333.337.search-card.all.click&vd_source=a642bb3ddc5b706845426dc41d73fbda