demo.go(切片类型):
package main
import "fmt"
func main() {
// 定义切片 (数组长度固定,切片的长度可以不固定)
var slice = []int{1,2,3,4,10:5} // 10表示下标
slice[1] = 100
fmt.Println(slice) // [1 100 3 4 0 0 0 0 0 0 5]
fmt.Println(len(slice)) // 11 长度11
// append 切片可以动态添加数据 (数组的长度是固定的,不能动态添加数据)
slice = append(slice,666) // 切片的长度发生了改变
slice2 := append(slice,777,888) // 可以添加多个元素
fmt.Println(slice2) // [1 100 3 4 0 0 0 0 0 0 5 666 777 888]
// 定义切片 (第二种方式)
var slice3 []int // 默认长度是0
// slice3[0] = 11 // 会报错。 slice3的默认长度是0
// 可以通过append动态添加元素
slice3 = append(slice3, 1,2,3,4,5)
fmt.Println(slice3) // [1 2 3 4 5]
// 定义切片 (第三种方式) make定义切片并指定初始长度 make(切片类型,长度[,容量])
var slice4 = make([]int, 10, 20) // 长度10,容量20(提前开辟内存空间,append添加数据不超容量时,切片地址不会变)。 容量可以省略不写。
fmt.Println(slice4) // [0 0 0 0 0 0 0 0 0 0]
}
demo.go(切片的地址):
package main
import "fmt"
func main() {
// 定义切片
var slice []int
// 打印切片地址 切片的变量名本身就是一个地址,不需要用&取地址
fmt.Printf("%p \n", slice) // 0x0 空切片的地址
// append为切片添加数据时,切片的地址可能会改变(切片后面如果有足够的连续空间时,地址就不会改变)
slice = append(slice, 1,2,3)
fmt.Printf("%p \n", slice) // 0xc00004a0c0
}
demo.go(切片的容量,扩容):
package main
import "fmt"
func main() {
// 定义切片。 make(切片类型,长度[,容量]) 容量(提前开辟空间,避免append时导致内存不够而复制原数据,影响性能)
slice := make([]int, 10, 20) // 长度10 容量20(提前开辟内存空间,append添加数据不超容量时,切片地址不会变)。
fmt.Printf("%p \n", slice) // 0xc000080000
// append添加数据 (不超过切片的容量,切片地址不会改变)
slice = append(slice, 1, 2, 3, 4, 5)
fmt.Printf("%p \n", slice) // 0xc000080000
// append添加数据 (超过切片的容量,切片地址可能会改变) (扩容,容量成倍数进行扩容(偶数);1024字节以上,每次扩容1/4)
slice = append(slice, 1, 2, 3, 4, 5, 6)
fmt.Printf("%p \n", slice) // 0xc000086000
fmt.Println(len(slice)) // 21 切片的长度
fmt.Println(cap(slice)) // 40 切片的容量
}