有时候,我们想在程序中多存储一些数据的内容,用我们前面学的知识知道,我们可以创建多个变量来接收这些数据,然后去对这些数据进行特定的操作。
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
欢迎大家关注下个人的「公众号」:独醉贪欢