Go数组,知道这些就算入门了

223 阅读2分钟

有时候,我们想在程序中多存储一些数据的内容,用我们前面学的知识知道,我们可以创建多个变量来接收这些数据,然后去对这些数据进行特定的操作。

func main(){
	var a int = 10
	var b int = 20
	var c int = 30
}

但是,Go语言提供了叫做 "数组" 的东西,让我们不用定义多个变量,就可以多存储一些数据内容

什么是数组?

数组存储的是同等类型的元素,这些元素在内存中的位置是连续的

数组的定义

var 变量名 [存储的长度]数据类型 = [存储的长度]数据类型{值1, 值2, ...}

变量名 := [存储的长度]数据类型{值1, 值2, ...}

0 =< 需要初始化值的个数(最后面括号中的值1,值2这些) <= 存储的长度

未初始化变量数组的默认值

package main

import "fmt"

func main(){
	a := [1]int{}
	b := [1]bool{}
	c := [1]string{}
	d := [1]byte{}
	e := [1]float32{}
	fmt.Println("int数组未初始化的默认值:", a)
	fmt.Println("bool数组未初始化的默认值:", b)
	fmt.Println("string数组未初始化的默认值:",c)
	fmt.Println("byte数组未初始化的默认值:", d)
	fmt.Println("float32数组未初始化的默认值:", e)
}

输出

int数组未初始化的默认值: [0]
bool数组未初始化的默认值: [false]
string数组未初始化的默认值: [ ]
byte数组未初始化的默认值: [0]
float32数组未初始化的默认值: [0]

数组是值传递还是引用传递

package main

import "fmt"

func main(){
	a := [1]int{1}
	fmt.Println("修改前的数组a的值:", a)
	test(a)
	fmt.Println("修改后的数组a的值:", a)
}

func test(a [1]int){
	a[0] = 5
}

输出

修改前的数组a的值: [1]
修改后的数组a的值: [1]

从输出可以看出,数组是值传递(跟其它语言不一样,比如Java),而不是引用传递

怎么把数据传进去之后,修改里面的值?

package main

import "fmt"

func main(){
	a := [1]int{1}
	fmt.Println("修改前的数组a的值:", a)
	test(&a)
	fmt.Println("修改后的数组a的值:", a)
}

func test(a *[1]int){
	a[0] = 5
}

输出

修改前的数组a的值: [1]
修改后的数组a的值: [5]

只要在其它函数中接收的参数中定义一个数组指针,然后我们传递一个地址过去就可以修改数组中的值了

什么是指针数组?什么是数组指针?

*[长度]变量类型{} → 数组指针
[长度]*变量类型{} → 指针数组(不能直接声明)
package main

import "fmt"

func main(){
	a := [1]*int{}
	fmt.Println("指针数组a", a)
	b := [1]int{}
	test(&b)
}

func test(b *[1]int){
	fmt.Println("b是数组指针", b)
}

输出

指针数组a [<nil>]
b是数组指针 &[0]

在这里,a是指针数组,test(b *[1]int)中的参数是数组指针

数组指针和指针数组怎么分辨?

我是这样分辨的,把 [] 和 变量类型切开来看,也就是以下这样

数组指针:*[长度]int, *[长度]在前,int在后,就是数组指针
指针数组:[长度]*int,[长度]在前,*int在后,就是指针数组,这个数组中,存的值int类型的指针

不指定长度的数组

[...]int{值1, 值2, 值3, ...}

... 是必须的,然后长度根据有多少个元素而定

package main

import "fmt"

func main(){
	a := [...]int{1,2,3,4,5}
	fmt.Println("a数组的长度为:", len(a))
}
a数组的长度为: 5

二维数组

二维数组的定义

指定长度的二维数组

var a [长度][长度]int = [长度][长度]int{{值1, ...},{值2, ...}, ...}
a := [长度][长度]int{{值1, ...},{值2, ...}, ...}

不指定长度的二维数组

这个后面 ... 的长度,跟前面的长度是一样的
var a [长度][长度]int = [...][长度]int{{值1, ...},{值2, ...}, ...}
第二个 []里面的长度是不可以省略的,不过前面的可以
a := [...][长度]int{{值1, ...},{值2, ...}, ...}

例子

package main

import "fmt"

func main(){
	a := [3][3]int{{1, 2, 3}, {4, 5, 6}}
	fmt.Println("a数组为:", a)
	fmt.Println()
}

输出

a数组为:  [[1 2 3] [4 5 6] [0 0 0]]

第一个 [ 长度 ]表示里面有多少行,第二个 [ 长度 ]表示有多少列,如下图 在这里插入图片描述 因为第3行没有初始化,所以是默认值0


欢迎大家关注下个人的「公众号」:独醉贪欢 在这里插入图片描述