切片
1.定义一个切片然后应用一个定义好的数组。
var intarr [5]int = [...]int{1, 2, 3, 4, 5}
//切片是引用类型,长度是动态的,其他与数组一样
//左闭右开,表示取数组intarr下标1到3(不包含3)
a := intarr[1:3]
2.make创建
1)make创建可以指定切片的大小,容量
2)没有给各元素赋值,那么就是默认值
3)创建的底层数组,对外不可见,只能通过slice访问
//2.make var 切片名 []type=make([]type,len,[cap]) cap>=len
// 数据类型 长度 容量可选
var s1 []int = make([]int, 4, 10)
s1[20] = 20
//3.定义一个切片,直接指定具体的数组,原理类似make
var strslice []string = []string{"jin", "wei", "chang"}
fmt.Println(strslice)
4.切整个数组
//左边为空表示从头开始,右边为空表示到底
var slice=arr[:]
5.切片定义完后,要引用到一个数组或make一个空数组才能使用
6.切片可再切
var arr1 [5]int = [...]int{10, 20, 30, 40, 50}
s := arr1[1:4] //20,30,40
s1:=s[1:2] //30
7append()
向切片中追加数据,使用append函数,原理是底层重新创建一个数组,切片再次引用过去。
var slice3 []int = []int{100, 200, 300}
slice3 = append(slice3, 400, 500, 600)
//只能追加切片(切片后的3个点不能少),不能追加数组,
slice3 = append(slice3, slice3...)
fmt.Println("slice3", slice3)
8.copy
1)2个切片才能使用copy
2)2者空间独立,不相互影响
3)当S2定义长度小于3时,会将S1按下标顺序依次取出放入S2,如果S2长度为1,那么就只能放入12
//将S1的3个元素复制到S2,如要2个切片完全一样,就将s2定义长度为3
var s1 []int = []int{12, 13, 14}
var s2 = make([]int, 5)
copy(s2, s1)
fmt.Println(s1) //[12 13 14]
fmt.Println(s2) //[12 13 14 0 0]
9 string是个引用类型,底层是个byte数组,也能切片
string不能用切片直接修改,要先转换成byte切片,再修改,然后再转换回string,
string中只能是字母和数字,不能有中文,会出现乱码
str := "abc@jinwei"
s2 := []byte(str)
s2[0] = 'p'
str = string(s2)
fmt.Println(str) //pbc@jinwei
转换为[]rune,按字符处理,兼容汉字
str1 := "天龙八部"
s3 := []rune(str1)
s3[0] = 'p'
str1 = string(s3)
fmt.Println(str1)//p龙八部
斐波那契数列
func main() {
ss := fbn(99)s
fmt.Println(ss)
}
func fbn(n int) []uint64 {
var fbnslice = make([]uint64, n)
fbnslice[0] = 1
fbnslice[1] = 1
for i := 2; i < n; i++ {
fbnslice[i] = fbnslice[i-1] + fbnslice[i-2]
}
return fbnslice
}