package main
import "fmt"
/*
切片
切片是引用类型,所以当实参传递给func 在func中更改切片 会影响切片的实际值
*/
func main() {
//数组
var intArr = [...]int{11, 22, 33, 44, 55}
fmt.Println(intArr)
//定义切片 方式一 定义一个切片来引用创建好的数组
//intArr[1:3]表示引用intArr数组,引用intArr的起始下标为1,结束下标为3(但是不包括3) 以后想获取数组某个值到某个值是也可以用arr[:]
slice := intArr[1:3] //这里切片引用了intArr数组 所以在下面改变切片的值 intArr的值也会改变
slice[0] = 555
fmt.Println(intArr)
fmt.Println("切片的值是", slice)
fmt.Println("切片的容量是", cap(slice)) //容量一般是长度的两倍但是不准这个是根据长度来动态增加的
//方式二
slice1 := make([]float64, 5, 10) //切片类型,切片长度,切片容量:这个容量参数是可选的可以不填
fmt.Println(slice1)
//方式三
slice2 := []string{"字", "富", "串"}
fmt.Println(slice2)
fmt.Println("长度是", len(slice2)) //3
fmt.Println("容量是", cap(slice2)) //3
//用内置函数append,对切片进行动态添加 若果切片容量不够可以自动增加容量
slice3 := []string{"第一", "第二"}
slice3 = append(slice3, "新加的")
fmt.Println(slice3)
//也可以追加切片 ...这三个点必须带
slice3 = append(slice3, slice2...)
fmt.Println(slice3)
//切片的拷贝 拷贝如果容量不够不会报错 如果长度是一那就从另一个切片中只拷贝一个
slice4 := []int{1, 2, 3}
slice5 := make([]int, 10)
copy(slice5, slice4) //将slice4拷贝给slice5 //copy()两个的参数类型必须都是切片
fmt.Println(slice4)
fmt.Println(slice5)
/*
string和slice string可以进行切片处理
string底层是byte数组 所以可以切片
*/
str := "heelo@hahaha"
slice6 := str[6:]
fmt.Println(slice6)
//修改字符串中某个值
slice7 := []byte(str) //将字符串转为byte类型切片
slice7[0] = 'z' //修改某个值
str = string(slice7) //再将byte类型的切片转为string,这就修改成功了 但是这只能修改英文和数组不能修改汉字,英文byte是1字节一个汉字是3个字节
fmt.Println(str)
//修改为汉字
slice8 := []rune(str) //将字符串转为rune类型切片
slice8[0] = '北' //修改某个值
str = string(slice8) //应为rune切片是按照字符处理所以兼容汉字
fmt.Println(str)
//斐波那契数列
var length int
fmt.Println("输入斐波那契数:")
fmt.Scanln(&length)
fbnFun := fbn(length)
fmt.Println(fbnFun)
}
func fbn(n int) []int {
var slice9 = make([]int, n)
for i := 0; i < n; i++ {
if i == 0 || i == 1 {
slice9[i] = 1
continue
}
slice9[i] = slice9[i-1] + slice9[i-2]
}
return slice9
}