Go 数组

一、复合类型:

在这里插入图片描述

二、数组

如果要存储班级里所有学生的数学成绩,应该怎样存储呢?可能有同学说,通过定义变量来存储。但是,问题是班级有80个学生,那么要定义80个变量吗?

像以上情况,最好是通过数组的方式来存储。

所谓的数组:是指一系列同一类型数据的集合。
1. 数组定义

var a [10]int

数组定义也是通过var关键字,后面是数组的名字a,长度是10,类型是整型。表示:数组a能够存储10个整型数字。也就是说,数组a的长度是10。

我们可以通过len()函数测试数组的长度,如下所示:

var a [10]int
fmt.Println(len(a))

输出结果为10。

当定义完成数组a后,就在内存中开辟了10个连续的存储空间,每个数据都存储在相应的空间内,数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度。

注意:数组的长度只能是常量。以下定义是错误的:

var n int = 10
var a [n]int

会报错。

2. 数组赋值
数组定义完成后,可以对数组进行赋值操作。数组是通过下标来进行操作的,下标的范围是从0开始到数组长度减1的位置。
在这里插入图片描述
var a[10] int表示的范围是a[0],a[1],a[2]…,a[9]。

2.1 第一种赋值方法:
在这里插入图片描述
2.2 第二种赋值方法
第一种赋值方式比较麻烦,可以使用如下所示:

var a [10]int
for i := 0; i < 10; i++ {
  a[i] = i + 1
}
for i := 0; i < 10; i++ {
  fmt.Println(a[i])
}

第一次循环i等于1,然后赋值给a[i]也就是a[1],然后a[1]也刚好等于1,然后循环十次。

2.3 使用len()函数方式赋值:
对上面的程序,进行如下的修改:

var a [10]int
for i := 0; i < len(a); i++ {
  a[i] = i + 1
}
for i := 0; i < len(a); i++ {
  fmt.Println(a[i])
}

同上一样的道理,虽然改成了len(a)但是其实他的值就是10,而且这样更加方便,你也不用刻意去知道他的长度是多少。

3. 数组数据输出:
可以使用range。如下所示:

for i,data := range a {
  //fmt.Println("下标:",i)
  fmt.Println("元素值:",data)
}

i变量存储的是数组的下标,data变量存储的是数组中的值。

3.1. 输出值,不输出下标:
如果只想输出数组中的元素值,不希望输出下标,可以使用匿名变量:

for _,data := range a {
  //fmt.Println("下标:",i)
  fmt.Println("元素值:",data)
}

上面的案例中,首先完成了数组的赋值,然后再输出数组中的值。但是,如果定义完成数组后,没有赋值,直接输出会出现什么样的问题呢?

var a [10]int
for i := 0; i < len(a); i++ {
  fmt.Println(a[i])
}

a数组中的元素类型是整型,定义完成后,直接输出,结果全部是0。

3.2 不同类型数组的默认值:

var a [10]float64 // 如果不赋值,直接输出,结果默认全部是0
var a [10]string // 如果不赋值,直接输出,结果默认全部是空字符
var a [10]bool // 如果不赋值,直接输出,结果默认全部是false.

4. 数组初始化

之前我们是定义数组,然后再完成数组的赋值。其实,在定义数组时,也可以完成赋值,这种情况叫做数组的初始化。
具体案例如下:

// 数组初始化
// 1.全部初始化
var a [5]int = [5]int{1,2,3,4,5}
fmt.Println(a)
// 在定义好一个数组的同时就给他赋值

// 自动推导
b := [5]int{1,2,3,4,5}
fmt.Println(b)

// 部分初始化
// 没有初始化的部分 默认为0
c := [5]int{1,2,3}
fmt.Println(c)
// 12300
// 指定某个元素初始化

d := [5]int{2:10,4:20}
fmt.Println(d)
// 其中2的值是10,4的值是20,其他的都为0
// ... 通过初始化确定长度
f:=[...]int{1,2,3}
fmt.Println(len(f))
// 3

5.练习:随机数

题目:红球 1-33选择6个且不重复,篮球1-16选择一个可以和红球重复

func main() {
	rand.Seed(time.Now().UnixNano())

	// 随机数
	//红球 1-33选择6个且不重复,篮球1-16选择一个可以和红球重复
	var red [6]int
	for i := 0; i < len(red); i++ {
		v := rand.Intn(33) + 1
		// 内层循环判断红球是否有重复的
		for j := 0; j < i; j++ {
			//数据重复
			if v == red[j] {
				//重新随机
				v = rand.Intn(33) + 1
				j = -1
			}

		}
		red[i] = v
	}
	fmt.Println("红球", red, "篮球", rand.Intn(16)+1)

}

红球 [19 14 29 6 2 1] 篮球 16

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

季布,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值