Golang学习 数组与动态数组(切片)

//定义普通数组,长度固定为10
var normalArray1 = [10]int
//为数组赋值,未定义的部分默认为0
var normalArray2 = [10]int{1,2,3,4}

//传参的时候严格控制数组的类型,必须是10个长度的int
//这个时候array是值传递,等于拷贝
func testArray(array [10]int) {
    for index,
    array[0] = 100 //修改数组不会影响原数组内容
}

//定义动态数组/切片 长度不固定
var sliceArray = []int

//这个时候array是引用传递,实际上传递的是指针
func testArray2(array []int) {
    array[0] = 100 //修改数组会影响原数组内容
}

//循环/遍历时使用range
for index, item := range testArray2 {
	fmt.Println(index, "=", item)
}
var slice1 = []int //定义一个空的slice
//此时这个切片未分配空间,长度为0,如果直接赋值会报错
slice1[0] = 100 //这个会报错


var slice2 = []int{1,2,3,4,5} //定义一个指定长度的slice,默认值是1,2,3,4,5
fmt.Printf("len = %d, value = %v \n", len(slice2), slice2)
//打印 len = 5, value = [1 2 3 4 5] 。%v 表示变量的详情

var slice3 = make([]int, 3) //定义一个3个长度的slice,默认值是0

var slice4 := make([]int, 3) //通常使用 := 定义

	var slice3 = make([]int, 3, 5) //定义一个长度为3,容量为5
	//len = 3, cap= 5, value = [0 0 0]
	fmt.Printf("len = %d, cap= %d, value = %v \n", len(slice3), cap(slice3), slice3)

	slice3 = append(slice3, 4) //使用append为切片追加一个长度
	//len = 4, cap= 5, value = [0 0 0 4]
	fmt.Printf("len = %d, cap= %d, value = %v \n", len(slice3), cap(slice3), slice3)

	slice3 = append(slice3, 5, 6) //当追加元素超过原设定的容量时,go会按照原先设定的容量再一次扩容
	//len = 6, cap= 10, value = [0 0 0 4 5 6]
	fmt.Printf("len = %d, cap= %d, value = %v \n", len(slice3), cap(slice3), slice3)

	var slice4 = slice3[:4] //从slice3截取一段元素,起点为0,结尾为4(不包含4),容量继承原切片
	//len = 4, cap= 10, value = [0 0 0 4]
	fmt.Printf("len = %d, cap= %d, value = %v \n", len(slice4), cap(slice4), slice4)

	var slice5 = slice3[1:] //从slice3截取一段元素,起点为1,一直到结尾,容量为原定容量减去起点
	//len = 5, cap= 9, value = [0 0 4 5 6]
	fmt.Printf("len = %d, cap= %d, value = %v \n", len(slice5), cap(slice5), slice5)

	var slice6 = slice3[3:5] //从slice3截取一段元素,起点为3,结尾为5(不包含5),容量为原定容量减去起点
	//len = 2, cap= 7, value = [4 5]
	fmt.Printf("len = %d, cap= %d, value = %v \n", len(slice6), cap(slice6), slice6)

Golang数组切片是两种不同的数据类型,用于存储相同数据类型的容器。数组的长度是固定的,而切片的长度是可变的。在日常应用中,切片的使用更为普遍。 数组在声明时需要指定长度,并且在初始化时必须提供相同长度的元素。例如,`a := int{1, 2, 3}`就是一个长度为3的整数数组数组的长度一旦确定后就不能更改。 切片是基于数组的引用类型。它不需要指定固定的长度,并且可以根据需要动态扩展或缩小。切片包装着底层数组,通过指定起始索引和结束索引来指定子集。例如,`b := a[:]`就是一个切片,它包含了数组a的所有元素。 数组适用于需要固定长度的场景,而切片适用于长度可变的情况。在实际应用中,切片更常用,因为它提供了更大的灵活性和便利性。 总结: - 数组是长度固定的容器,切片是长度可变的容器; - 数组在声明时需要指定长度,切片则不需要; - 数组的长度一旦确定后就不能更改,而切片可以根据需要动态扩展或缩小; - 切片是基于数组的引用类型,可以通过指定起始索引和结束索引来指定子集。 参考资料: Golang中的「数组」和「切片」都是存储同一数据类型的容器,只不过Golang中的数组长度是固定的,而切片的长度是可变化的。 切片是引用类型,切片包装的数组称为该切片的底层数组。我们来看一段代码://a是一个数组,注意数组是一个固定长度的,初始化时候必须要指定长度,不指定长度的话就是切片了 a := int{1, 2, 3} //b是数组,是a...。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值