Golang - 数组

博客主要介绍了数组,其定义时长度固定不可变,元素为同一数据类型且可变,属于值类型。还阐述了数组的使用,包括创建、取值、遍历等,以及多维数组的相关操作,最后对数组是值类型进行了验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


数组介绍

  • 定义时固定长度, 不可变
  • 元素均为同一数据类型, 且可变
  • 值类型

数组的使用

创建

package main

import "fmt"

func main() {
	// 先声明数组, 需要确定数组长度, 元素类型
	var (
		arrayA [3]int
		arrayB [5]int
	)
	// 初始化
	arrayA = [3]int{1, 2, 3}
	arrayB = [5]int{10, 9, 8} // 可少放, 默认补 0
	fmt.Println(arrayA, arrayB)

	// 声明并初始化
	var arrayC = [3]string{"bj", "sh", "sz"}
	fmt.Println(arrayC)

	// 简短声明
	arrayC2 := [3]string{"bj", "sh", "sz"}
	fmt.Println(arrayC2)

	// ... 由编译器确定数组长度
	arrayD := [...]int{1, 32, 3, 14, 125, 1312, 31231}
	fmt.Printf("%[1]T, %[1]v\n", arrayD)

	// 根据索引值初始化
	arrayE := [5]int{3: 100} // 索引为3的元素赋值为100, 若使用..., 则索引就是最大长度
	fmt.Println(arrayE)
}


取值

// 根据索引取值

arrayA[0]

遍历

package main

import "fmt"

func main() {
	arrayE := [5]int{3: 100}
	
	// for循环遍历
	for i := 0; i < len(arrayE); i++ {
		fmt.Println(arrayE[i])
	}

	// for range 遍历
	for _, v := range arrayE {
		fmt.Println(v)
	}
}

练习

z := [...]int{1,3,5,7,8}

// 1. 求元素和
sum := 0
for _,v := range z {
	sum += v
}

// 2. 求和为8的两个元素的索引
for k1, v1 := range z {
	for k2, v2 := range z[k1:] {
		if v1+v2 == 8 {
			fmt.Println(k1, k1+k2)
		}
	}
}

多维数组

创建

package main

import "fmt"

func main() {

	// 先声明, 后赋值
	var a [3][2]int
	a = [3][2]int{
		[2]int{1, 2},
		[2]int{3, 4},
	}
	fmt.Println(a) // 结果为 [[1 2] [3 4] [0 0]], 最后一个默认用0补齐

	// 声明同时完成初始化
	var b = [3][2]int{
		[2]int{1, 2},
		[2]int{3, 4},
	}
	fmt.Println(b) // 结果为 [[1 2] [3 4] [0 0]], 最后一个默认用0补齐

	// 简短声明
	c := [3][3]int{
		[3]int{1, 2, 3},
		[3]int{2, 3, 4},
	}
	fmt.Println(c)
}


关于…的使用

// 在多维数组中, 只有最外层能使用...
a := [...][2]int{
	{1,2},
	{3,4},
	{5,6}, // 可以写多个, 由编译器确认数量
}

取值

// 根据索引取值

arrayA[0][1]

遍历

package main

import "fmt"

func main() {

	// for循环遍历每个元素
	for i := 0; i < len(c); i++ {
		for j := 0; j < len(c[i]); j++ {
			fmt.Println(c[i][j])
		}
	}

	// for range 遍历每个元素
	for _, v1 := range c {
		for _, v2 := range v1 {
			fmt.Println(v2)
		}
	}
}


验证: 数组是值类型

package main

import "fmt"

func main() {
	// 可以理解为值类型存的是指, 引用类型存的是指针

	// 创建一个数组
	m := [1]int{1} 

	// 将数组进行复制
	n := m         

	// 改变其中一个的元素, 如果 m 和 n 的结果不同则为值类型   
	m[0] = 100           // 修改n的元素, 修改m的元素效果相同
	fmt.Println(m, n)    // 结果为[1] [100]
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值