【go学习合集】进阶数据类型1 -------->数组

定义

概念定义

数组是一种非常基本的数据结构,用于存储固定大小的同类型元素的集合。与切片不同,数组的长度在声明时就必须确定,且在其生命周期内不可改变。

代码使用

定义数组

package main

import "fmt"

func main() {
	// 第一种定义方式
	var a = [5]int{}
	// 第二种定义方式, 定义时初始化
	var b = [5]int{1, 2, 3, 4, 5}
	// 第三种定义方式, 只定义部分,未定义的由0补足
	var c = [5]int{1, 2, 3}
	// 第四种定义方式, 不显示定义长度,由初始化值的个数决定
	var d = [...]int{1, 2, 3, 4, 5}
	// 第五种定义方式
	var e [5]int
	// 第六种定义方式
	f := [5]int{}

	fmt.Printf("a = %v\n", a)
	fmt.Printf("b = %v\n", b)
	fmt.Printf("c = %v\n", c)
	fmt.Printf("d = %v\n", d)
	fmt.Printf("e = %v\n", e)
	fmt.Printf("f = %v\n", f)
}


-------------------------运行结果--------------------------
a = [0 0 0 0 0]
b = [1 2 3 4 5]
c = [1 2 3 0 0]
d = [1 2 3 4 5]
e = [0 0 0 0 0]
f = [0 0 0 0 0]

访问与修改数组

数组的访问和其他语言类似,通过index的方式进行访问,也是从0开始计算索引

package main

import "fmt"

func main() {
	var a = [5]int{1, 2, 3, 4, 5}
	fmt.Printf("第一个数是:%d\n", a[0])
	// 对a[0]进行修改
	a[0] = 10
	fmt.Printf("第一个数是:%d", a[0])
}
-------------------------运行结果--------------------------
第一个数是:1
第一个数是:10

查询数组长度

package main

import "fmt"

func main() {
	var a = [5]int{}
	fmt.Printf("a的长度为:%d\n", len(a))
}
-------------------------运行结果--------------------------
a的长度为:5

多维数组

我们上面所说的都是一维数组,如[1,2,3,4,5]。如定义所说那样,数组用来存储相同类型的数据类型的集合,我们可以通过定义数组的数组,数组的数组的数组来实现多维数组。

package main

import "fmt"

func main() {
	var a = [5][5]int{}
	var b = [5][5][5]int{}
	fmt.Printf("a = %v\n", a)
	fmt.Printf("b = %v\n", b)
	a[0][0] = 10
	fmt.Printf("a = %v\n", a)
}

-------------------------运行结果--------------------------
a = [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
b = [[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]] [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]] [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]] [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]] [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]]
a = [[10 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]

遍历数组

package main

func main() {
	// 一维数组
	a := [5]int{1, 2, 3, 4, 5}
	for index, element := range a {
		// index是索引,element是元素
		// todo something
	}
	b := [5][5]int{{1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}}
	for index1, element1 := range b {
		for index2, element2 := range element1 {
			// 几维数组就需要几层for循环来遍历
		}
	}
}

想要解决的问题

  1. 提供了一种基础数据类型,用于存储和使用固定大小同类型的数据
  2. 定义时就在内存中分配好了连续内存,其访问速度相比切片更快,但不如切片灵活

使用场景

需要存储和使用相同数据类型的数据

问题探究

如果index值超出了数组的范围会怎样

会编译报错,直接不给使用,可以使用变量跳过编译报错,但是会panic(数组越界)

package main

import "fmt"

func main() {
	// 一维数组
	a := [5]int{1, 2, 3, 4, 5}
	fmt.Printf("第-1个元素是;%d\n", a[-1])
	fmt.Printf("第5个元素是;%d\n", a[5])
}
-------------------------运行结果--------------------------
./main.go:8:41: invalid argument: index -1 (constant of type int) must not be negative
./main.go:9:40: invalid argument: index 5 out of bounds [0:5]
package main

import "fmt"

func main() {
	// 一维数组
	a := [5]int{1, 2, 3, 4, 5}
	i := 5
	fmt.Printf("第i个元素是%d\n", a[i]) // 通过该方式可以越过编译报错
}
-------------------------运行结果--------------------------
panic: runtime error: index out of range [5] with length 5

goroutine 1 [running]:
main.main()
        /Users/bytedance/GolandProjects/awesomeProject/main.go:9 +0x24

把数组作为入参进行修改,会修改原数组的值么

数组是值传递,赋值和传递会创建副本,不会修改原有数组的值

package main

import "fmt"

func main() {
	var a = [5]int{1, 2, 3, 4, 5}
	fmt.Printf("修改前a=%v\n", a)
	change(a)
	fmt.Printf("修改后a=%v\n", a)
}

func change(input [5]int) {
	input[0] = 100
}
-------------------------运行结果--------------------------
修改前a=[1 2 3 4 5]
修改后a=[1 2 3 4 5]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值