一、数组
定义:
var 数组名 [数组大小]数组类型
var a [5]int // 定义完数组各个元素就有默认值
- 数组的地址可以通过数组名来获取&arr
- 数组的第一个元素的地址,就是数组的首地址
- 数组的各个元素的地址间隔是依据数组类型决定的,如int64->8
arr[0]的地址加8个字节就是arr[1] 的地址
四种初始化方式:
func main() {
var arr [3]int = [3]int{1, 2, 3}
var arr2 = [3]int{1, 2, 3}
var arr3 = [...]int{1, 2, 3}
var arr3 = [...]string{0: "xxx", 1: "zzz"}
}
for range 遍历数组:
func main() {
// 第一个返回值index是数组的下标
// 第二个返回值value是下标对应的值
// 他们都是仅在for循环内部可见的变量
var arr3 = [...]string{0: "xxx", 2: "zzz"}
for index,value := range arr3 {
fmt.Printf("索引:%v, 值:%vn", index, value)
}
}
一、切片
切片是数组的引用
func main() {
var intArr [5]int = [...]int {1, 2, 33, 44, 56}
// 引用数组下标为1,最后的下标为3(但不包括3) 22, 33
slice := intArr[1:3]
fmt.Println("数组:", intArr)
fmt.Println("切片:", slice)
fmt.Println("切片个数:", len(slice))
fmt.Println("切片容量:", cap(slice)) // 切片的容量可以动态变化
}
切片内存存储切片不存储任何元素, 只是对现有数组的引用,对切片的任何修改,都反映在底层数组中。
slice从底层来说,其实就是一个数据结构(struct结构体)
type slice struct {
ptr *[2]int // 数组的第几个元素的地址
len int
cap int // 是切片的第一个元素到底层数组末尾元素的个数
}
切片的使用方式
- 定义一个切片,然后让切片引用一个已经创建好的数组。
var intArr [5]int = [...]int {1, 2, 33, 44, 56}
slice := intArr[1:3]
- 通过make来创建切片。
// var 切片名 []type = make([]int, len, cap)
// 对于切片必须先make再使用
var slice []int = make([]int, 2, 4)
通过make方式创建的切片对应的数组是由make底层维护,对外不可见,只能通过slice去访问各个元素
- 定义一个切片,直接就指定具体数组,使用原理类似make的方式
var slice []int = []int{1, 2, 4}
切片细节
var slice = arr[0:end] 可以简写成 var slice = arr[:end]
var slice = arr[start:len(arr)] 可以简写成 var slice = arr[start:]
var slice = arr[0:len(arr)] 可以简写成 var slice = arr[:]切片可以继续切片
append 内置函数,可以对切片进行动态增加
var slice []int = []int{1, 2, 3}
slice2 := append(slice, 400, 500)
切片append操作的本质是对数组扩容
如果超过了原容量,go底层会创建一个新的数组newArr
将slice原来包含的元素拷贝到新的数组newArr
slice重新引用到newArr,newArr底层维护,程序员不可见
切片的拷贝copy,a和slice的数据空间是独立的,互不影响。
var slice []int = []int{1, 2, 3}
var a = make([]int, 10)
copy(a, slice)
string和切片关系
var str string = "hello@atguigu"
// 获取atguigu
slice := str[6:]
// string 是不可变的,不能str[0] = "z",来修改字符串
// 要修改可将string->[]byte 或 string->[]rune
arr1 := []byte(str)
arr1[0] = 'z'
str = string(arr1)
// []byte是通过字节处理的,不能处理中文,因为一个中文占3个字节,需要转成[]rune
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。