使用数组的时候,会不会觉得数组不太灵活
所以golang为我们提供了一种切片
var arr = [5]int{4, 5, 6, 7, 8}
var slice = arr[0:5] // 切片的两边也是顾头不顾尾
fmt.Println(slice)
array[开始引用的index : 结束引用的index+1]
这里的slice是从arr中切片切出来的
:两边是顾头不顾尾(前闭后开)
左边不写默认是0
右边不写默认是最后一个
切片是对数组的引用
如果改变切片中的元素,对应的数组也会变化
var arr = [5]int{4, 5, 6, 7, 8}
var slice = arr[0:5]
slice[0] = 1
fmt.Println(arr)
指向切片的切片
var arr = [5]int{4, 5, 6, 7, 8}
var slice = arr[0:5]
var s1 = slice[0:2]
slice[0] = 1
fmt.Println(s1)
fmt.Println(slice)
fmt.Println(arr)
切片是引用类型,默认值为nil
var s []int
fmt.Println(s == nil) // true
遍历方式同数组
分配内存空间
使用make
var s []int
s = make([]int, 3, 5) // 创建一个长度为3, 容量为5的空间
fmt.Println(s) // [0 0 0]
容量不写,默认等于长度
查看长度和容量
len
cap
由系统自动创建底层数组
s := []int{1,2,3,4}
追加元素
s1 := []int{1,2,3,4}
s = append(s1, 5, 6, 7, 8) // 底层创建了新的数组,不在应用原数组
复制数组
// 复制
var s1 = make([]int, 8, 8)
copy(s1, s) // 将s复制到s1,复制的个数就是s1的容量大小
fmt.Println(s1)
string与 []byte
str := "hello 世界"
fmt.Printf("[]byte(str)=%s\n", []byte(str))
fmt.Printf("[]byte(str)=%v\n", []byte(str))
// 汉字被分成了三个数字
for i, v := range str{
fmt.Printf("str[%d]=%c\n", i, v)
}
函数参数接收多个值
package main
import "fmt"
func Sum(numList ...int) int {
sum := 0
for _, v := range numList {
sum += v
}
return sum
}
func main() {
sum := Sum(1, 3, 4, 5, 6)
fmt.Println(sum)
}