切片:
切片初始化:
var b[]int = []int{1,2,3,4,5}
切片定义(代码):
切片是数组的引用,所以先创建一个数组
var a [5]int
var b[]int = a[0:2] b是切片
伪代码定义:
a[start:end]
示例
字符串切片:
//一个bytes占一个字节 一个字节是8位
//一个字符--》有可能占一个字节,或者三个字节
//一个中文,占3个字节
字符串底层是bytes的切片, 是用指针指向utf-8字节数组!!
字符串是只读的!!,所以需要把字符串转切片,然后在修改字符串,那就相当于开辟一块新的内存空间
修改字符串,可将其转化成【】rune或[]bytes ,完成后在转化为string ,无论哪种方式,都会重新分配内存,并复制字节数组
var str = "hello word"
//把字符串转切片,然后在修改字符串
str1 := str[:]
fmt.Printf("%s\n",str1)
//单引号是代表一个字符
var b []byte = []byte(str)
//通过下标重新赋值
b[0] = 'a'
str2 := string(b)
fmt.Println(str2,len(b))
示例一:
func testRever() {
//英文反转
var str = "hello word"
var b []byte = []byte(str)
for i:=0;i< len(b) /2 ;i++{
b[i] = b[len(b) -i -1]
b[len(b) -i -1] = b[i]
}
str2 := string(b)
fmt.Println(str2,len(b))
}
实例二:
中文操作:rune
func testChina() {
//带中文的反转
str :="Hi 我爱晨红"
//rune 可能占一个字节或者多个字节
b :=[]rune(str)
fmt.Println("testChina",len(str),len(b))
for i:=0;i< len(b) /2 ;i++{
b[i],b[len(b) -i -1] = b[len(b) -i -1],b[i]
}
str2 := string(b)
fmt.Println("testChina",str2)
}
func testConetChine() {
//统计中文,和英文出现的次数
str :="翟hello,worker"
b :=[]rune(str)
fmt.Println("testChina",len(str),len(b))
}
>>>>testChina 17 13
得出!!当统计类型为字符串的适合,它会把每个值都当成一个字节来统计
转换rune后,那统计rune后的值,长度就变化了
实例三:
func testConetChine() {
//统计中文,和英文出现的次数
str :="哈哈哈哈测试,hello,worker"
b :=[]rune(str)
fmt.Println("testChina",len(b),len(str))
}
切片的创建:
切片Copy:
copy(目标切片,源切片)
s1 :=[]int{1,2,3}
s2 :=make([]int,10)
copy(s2,s1)
fmt.Println("\n",s1)
fmt.Println("\n",s2,cap(s2))
>------
[1 2 3]
[1 2 3 0 0 0 0 0 0 0] 10
切片Append:
定义切片: s3 :=[]int{1,2,3}
s4:=append(s3,3,4,5,6)
数组 / 切片 中的 ... 使用
数组:
func testArray() {
var a [5]int = [5]int{1,3}
fmt.Println(a)
//数组的... 是系统内部帮你计算,当你不知道有多少个的时候,那就用...
var c = [...]int{1,3,4}
fmt.Println(c)
}
切片:
2个切片的append
//... 就是展开切片的意思
a = make([]int,5)
var b[] = []int{1,3,6,10}
a = append(a,b...)