1.切片:切片是数组的一个引用,因此切片是引用类型
2.切片的长度可以改变,因此,切片是个可变的数组。
3.切片遍历方式和数组一样,可以用len()求长度
4.cap可以求出slice最大的容量,0<=cap(slice) <=len(array),其中array是slice引用的数组
5.切片的定义:var 变量名 [ ]类型,例如:var str []string ,var arr [] int
package main import "fmt" //slice,map,channel都是用make初始化
func testSlice() {
var slice []int
//用数组初始化切片
var arr []int = [...]int{, , , , }
//arr[start:end] 取头不取尾
//arr[:] 复制一份数组
//去掉切片最后一个元素可以写,slice[:len(slice)-1]
//去掉第一个元素就是slice[1:]
slice = arr[:]
fmt.Println(slice)
fmt.Println(len(slice))
fmt.Println(cap(slice))
fmt.Println()
slice = slice[:]
fmt.Println(len(slice))
fmt.Println(cap(slice)) }
func main() {
testSlice()
}
6.切片的内存布局。
7.通过make创建切片
var slice []type=make([]type,len)
slice := make([]type,len)
slice :=make([]type,len,cap)
8.用append内置函数操作切片
append是双倍cap扩容
string底层就是一个byte的数组,也可以进行切片操作
string底层布局
package main import "fmt" func testSlice() {
var a []int = [...]int{, , , , }
s := a[:] //切片s是[2,3,4,5]
fmt.Printf("before len[%d],cap[%d]\n", len(s), cap(s))
s[] =
//%p 指针
fmt.Printf("s=%p a[1]=%p\n", s, &a[])
fmt.Println("before a:", a)
s = append(s, )
s = append(s, )
fmt.Printf("after len[%d] cap[%d]\n", len(s), cap(s))
s = append(s, )
s = append(s, )
s = append(s, )
s[] =
fmt.Println("after a:", a)
fmt.Println(s)
fmt.Printf("s=%p a[1]=%p\n", s, &a[])
//append的...用法
//append会扩容切片容量,默认cap的2倍
fmt.Println("-----分隔符-----(append的...用法)")
var a1=[]int{,,}
var b=[]int{,,}
a1=append(a1,b...)
fmt.Println(a1)
//切片拷贝,copy不会扩容
fmt.Println("-----分隔符-----(切片拷贝)")
s1:=[]int{,,,,}
s2:=make([]int,)
copy(s2,s1)//结果[1 2 3 4 5 0 0 0 0 0],以s1开头
fmt.Println(s2)
//string切片,string本身是不可改的
fmt.Println("-----分隔符-----(string切片)")
str:="hello world"
res1:=str[:]
fmt.Println(res1)
res2:=str[:]
fmt.Println(res2)
} //修改string的方法
//改中文字符一定要用rune,不能用byte
func testModifyString(){
fmt.Println("----分隔符----")
s:="我hello world"
s1:=[]rune(s) s1[]='你'
s1[]='我'
s1[]='他' str:=string(s1)
fmt.Println(str)
}
func main() {
testSlice()
testModifyString()
}