1.切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制。
2.切片的使用和数组类似,遍历切片、访问切片的元素和求切片长度 len(slice)都一样。
3.切片的长度是可以变化的,因此切片是一个可以动态变化数组。
var 切片名 []类型
var a []int
var intArr [5]int = [5]int{1,3,4,7788,999} | |
slice := intArr[1:3] | |
fmt.Println("initArr=", intArr) | |
fmt.Println("slice的元素=", slice) | |
fmt.Println("slice的元素个数=", len(slice)) | |
fmt.Println("slice的元素容量=", cap(slice))//切片的容量就可以动态变化 |
initArr= [1 3 4 7788 999]
slice的元素= [3 4]
slice的元素个数= 2
slice的元素容量= 4
切片的使用:
1.让切片去引用一个已经创建好的数组
var intArr [6]int = [6]int{1,3,4,7788,999,777} | |
slice := intArr[2:5] |
2.通过make来创建数组
var 切片名 []type =make([]type,len,[cap]) | |
var slice []float64 = make([]float64, 5, 10) | |
slice[1] = 10 | |
slice[2] = 20 | |
fmt.Println(slice) | |
fmt.Println(len(slice)) | |
fmt.Println(cap(slice)) | |
运行结果: | |
[0 10 20 0 0] | |
5 | |
10 |
cap>len
3.定义一个切片,直接指定具体数组,使用原理类似make的方式
var slice []string = []string{"tim", "jack", "ma"} | |
fmt.Println(slice) | |
fmt.Println(len(slice)) | |
fmt.Println(cap(slice)) | |
运行结果: | |
[tim jack ma] | |
3 | |
3 | |
var arr [5]int = [...]int{10,20,30,40,50} | |
slice := arr[1:5] | |
fmt.Println(slice) | |
slice = append(slice, 11) | |
fmt.Println(slice) | |
slice1 := slice[1:2] | |
slice1[0] = 100 | |
fmt.Println(slice1) | |
fmt.Println(slice) |
切片可以继续切片,新的切片和旧的切片指向的是同一个空间,用 append 内置函数,可以对切片进行动态追加
ste := "hello@aaaa" | |
slice := ste[3:] | |
ste[0] = 'a' | |
fmt.Println(slice) | |
string 是不可变的,也就说不能通过 str[0] = 'z' 方式来修改字符串 |
如果需要修改字符串,可以先将 string -> []byte / 或者 []rune -> 修改 -> 重写转成 string
//str := "hello@aaaa" | |
//arr := []byte(str) | |
//arr[0] = 'q' | |
//str1 := string(arr) | |
//fmt.Println(str1) | |
str := "我门我问问" | |
arr := []rune(str) | |
arr[0] = '被' | |
str1 := string(arr) | |
fmt.Println(str1) |
byte可以用来处理字符串和数字,[]rune可以用来处理汉字