Go 切片类型,定义切片。切片的地址,切片的容量

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  切片的容量
}

猜你喜欢

转载自blog.csdn.net/houyanhua1/article/details/88645742