1.切片跟数组操作的一些方式比较类似,最基本的区分就是 数组是定长 而 切片可以不定长
2.切片也是引用类型
切片使用的三种方式
方式一:
package main
import(
"fmt"
)
func main(){
intArr := [...]int{11,22,33,44,55}
/*
slice:切片名称
intArr[1:3] :表示 slice 引用到intArr这个数组
引用数组 1:起始下标 3:截止下标(但不包括3)
*/
slice := intArr[1:3]
fmt.Println("intArr =",intArr)
fmt.Println("slice 的元素个数是=",len(slice))
fmt.Println("slice 的容量是=",cap(slice))
/*
结果
intArr = [11 22 33 44 55]
slice 的元素个数是= 2
slice 的容量是= 4
*/
//修改切片的0下标 那么数组的1下标也会发生变化,因为是引用关系
slice[0] = 1
fmt.Println(intArr)
fmt.Println(slice)
/*
结果
intArr = [11 22 33 44 55]
slice 的元素个数是= 2
slice 的容量是= 4
[11 1 33 44 55]
[1 33]
*/
}
方式二,三
package main
import(
"fmt"
)
func main(){
//方式二
//演示切片的使用
//make 声明切片 参数1:类型 参数2:长度 参数3:容量
var slice []int = make([]int,5,10)
slice[0] = 10
slice[4] = 33
fmt.Println(slice)
fmt.Println("slice 的长度=",len(slice))
fmt.Println("slice 的容量=",cap(slice))
/*
[10 0 0 0 33]
slice 的长度= 5
slice 的容量= 10
*/
//方式三
//var strSlice []string = []string{"tom","make","jom"}
strSlice := []string{"tom","make","jom"}
fmt.Println(strSlice)
fmt.Println("strSlice 的长度=",len(strSlice))
fmt.Println("strSlice 的容量=",cap(strSlice))
/*
结果:
[tom make jom]
strSlice 的长度= 3
strSlice 的容量= 3
*/
}
切片的遍历基础操作
package main
import(
"fmt"
)
func main(){
var arrInt [5]int = [5]int{10,20,30,40,50}
var slice []int = arrInt[1:4]
//for 循环
for i := 0; i < len(slice); i++{
fmt.Printf("slice[%v]=%v ",i,slice[i])
}
//结果:slice[0]=20 slice[1]=30 slice[2]=40
fmt.Println()
//for range循环
for index,value := range slice{
fmt.Printf("index = %v value = %v\n",index,value)
}
/*
index = 0 value = 20
index = 1 value = 30
index = 2 value = 40
*/
//用append内置函数,可以对切片进行动态追加
var slice3 []int = []int{100,200,300}
slice3 = append(slice3,400,500,600)
fmt.Println("slice3",slice3)
//结果slice3 [100 200 300 400 500 600]
//也可以用切片进行追加,必须也是切片
slice3 = append(slice3,slice3...)//...必须要的
fmt.Println("slice3",slice3)
//结果slice3 [100 200 300 400 500 600 100 200 300 400 500 600]
//copy 拷贝内置函数 *必须都是切片类型才可以进行拷贝
var a []int = []int{1,2,3,4,5}
var slice4 = make([]int,10)
fmt.Println("slice4 = ",slice4)
//结果slice4 = [0 0 0 0 0 0 0 0 0 0]
copy(slice4,a)
fmt.Println("slice4 = ",slice4)
//结果slice4 = [1 2 3 4 5 0 0 0 0 0]
}
修改string 先转成[]byte 或 []rune -》修改 -》重新在转成string
package main
import(
"fmt"
)
func main(){
str := "hello@atesadas"
//获取a后面的字符串
slice1 := str[6:]
fmt.Printf("slice1 = %v slice1 的类型 = %T\n",slice1,slice1)
//结果slice1 = atesadas slice1 的类型 = string
//把hello@atesadas 改成 zello@atesadas
//先转成[]byte 或 []rune -》修改 -》重新在转成string
arr1 := []byte(str)
arr1[0] = 'z'
str = string(arr1)
fmt.Printf("str = %v str 的类型 = %T\n",str,str)
//结果str = zello@atesadas str 的类型 = string
//上面的只能修改 英文是数字 ,byte是根据字节来处理 而一个中文就占3个字符 所以会乱码
//解决方式把byte 改成rune rune可以兼容中文
arr2 := []rune(str)
arr2[0] = '天'
str = string(arr2)
fmt.Printf("str = %v str 的类型 = %T",str,str)
//结果str = 天ello@atesadas str 的类型 = string
}
斐波那契数
package main
import(
"fmt"
)
// 斐波那契数 uint64 长度未知所以放一个最大接收类型
func test(n int) ([]uint64){
slice := make([]uint64,n)
slice[0] = 1
slice[1] = 1
//前俩个数都为1 从下标为2的开始
for i := 2; i < n; i++{
//下标为2的数 是 前一个数和前二个数相加
slice[i] = slice[i - 1] + slice[i - 2]
}
return slice
}
func main(){
slice := test(10)
fmt.Println(slice)
//结果[1 1 2 3 5 8 13 21 34 55]
}