**
追加
**
一般通过append添加元素
var number = make ([]int,3,5)
//向numbers切片追加一个元素1,numbers len = 4 ,[0,0,0,1] cap = 5
numbers = append(numbers,1)
append可以添加任意数量相同类型的元素
numbers = append(numbers,1,2,3,4)
切片的内存示意大概如下:
number:头指针
ptr:尾指针永远指向合法元素的最后一个位置
后面两个实际上是非法的,到那时底层已经分配了内存
总结:
- 切片的长度和容量不同,长度表示左指针到右指针之间的距离,容量表示左指针至底层数组末尾的距离
- 切片的扩容机制,append的时候,如果长度增加后超过容量,则将容量增加2倍,可通过运行以下代码(1.1)进行实践
- 如果想修改切片的
//1.1切片的追加
package main
import "fmt"
func main(){
var number = make ([]int,3,5)//make定义长度,提供容量 3长度,5容量
fmt.Printf("len = %d, cap = %d, slice = %v\n", len(numbers), cap(numbers), numbers)
//向numbers切片追加一个元素1,numbers len = 4 ,[0,0,0,1] cap = 5
numbers = append(numbers,1)
//向numbers切片追加一个元素1,numbers len = 5 ,[0,0,0,1,2] cap = 5
numbers = append(numbers,2)
//向一个容量已经满的切片增加一个元素的时候,会自动开辟一个与原来相同容量的空间numbers len = 6 ,[0,0,0,1,2,3] cap = 10
numbers = append(numbers,3)
fmt.Println("----------")
var numbers2 = make([]int,3)
fmt.Printf("len = %d, cap = %d, slice = %v\n",len(numbers2), cap(numbers2),numbers2)
//向一个容量已经满的切片增加一个元素的时候,会自动开辟一个与原来相同容量的空间numbers此时len = 4, [0,0,0,1], cap=6
numbers2 = append(numbers2,1)
}
**
截取
**
一般通过[:]的形式截取数组并赋值。
s := []int{1,2,3}//len = 3, cap = 3
//[0,2)
s1 := s[0:2]//[1,2]
但此时因为s和s1是指向同一个地址的,所以如果s1[0]跟更改了s和s1都会被更改
想两个不同的话,go提供了一个copy函数,可以将底层数组的slice一起进行拷贝
//将s中的值,一次拷贝到s1中
copy(s1,s)
可通过运行以下代码(1.2)进行实践
//1.2切片的截取
package main
import "fmt"
func main(){
s := []int{1,2,3}//len = 3, cap = 3
//[0,2)
s1 := s[0:2]//[1,2]
fmt.Println(s1)
s1[0] = 100
fmt.Println(s)
fmt.Println(s1)
//因为s和s1是指向同一个地址的,所以如果s1[0]跟更改了s和s1都会被更改/
//想两个不同的话,go提供了一个copy函数
//copy可以将底层数组的slice一起进行拷贝
s2 := make([]int,3)//s2 = [0,0,0]
//将s中的值,一次拷贝到s2中
copy(s2,s)
fmt.Println(s2)
}