本文系第十一篇Golang语言学习教程
数组
数组是同一类型元素的集合。一个数组可以由0个或多个元素组成。
定义数组的格式:
var <varName> [n]type , n >0
n
表示数组中元素的数量,type
代表每个元素的类型;元素数量n
同时作为数组类型的长度,例:
var a [2]int //数组 a 是长度为 2 的 int 型数组
var b [2]int //数组 b 是长度为 1 的 int 型类型,与数组 a 是完全不同的类型
且Go语言中不允许混合不同类型的元素,例如包含字符串和整数的数组。
package main
import "fmt"
func main(){
var a [2]int // //定义一个长度为 2 的整数数组
fmt.Println(a)
}
数组中所有元素都被自动赋值为数组类型的零值,a
是一个整数数组,所以a
的所有元素都被赋值为int
型的零值:0。以上程序的运行结果为[0 0]
数组的索引从0
开始,到length -1
结束,让我们给上面的数组赋值:
package main
import "fmt"
func main(){
var a [2]int //定义一个长度为 2 的整数数组
a[0] = 45
a[1] = 25
fmt.Println(a)
}
a[0]
将值赋给 a 数组的第一个元素。以上程序的运行结果为:[45 25]
简略声明
package main
import "fmt"
func main(){
/*简略声明*/
b := [3]int{15, 35, 55}
fmt.Println(b)
}
上面的程序运行结果为:[15 35 55]
在简略声明中,不需要将数组中的所有元素赋值
package main
import "fmt"
func main(){
c := [4]int{12}
fmt.Println(c)
}
在上面程序中,c := [4]int{12}
声明一个长度为4的数组,但只提供了一个12的值,剩下的三个元素自动赋值为0
。
上面的程序运行结果为:[12 0 0 0]
甚至可以忽略声明数组的长度,用[...]
来代替,编译器将自动计算长度:
package main
import "fmt"
func main(){
d := [...]int{1, 3, 5, 7}
fmt.Println(d)
}
数组的类型
数组是值类型而不是引用类型,当数组赋值给一个新变量后,该变量会得到一个数组的副本,如果对新变量进行更改,不会影响原始数组。
package main
import "fmt"
func main(){
e := [...]string{"BTC", "ETH", "EOS"}
f := e
f[0] = "QTUM" //更改数组 f 的第一个元素
fmt.Println("e is ", e) //对 数组 f 值修改不会影响到原始数组
fmt.Println("f is ", f)
}
上面程序中,将e
赋值给了f
,对f
的第一个元素修改,不会影响到原始数组。
上面的程序运行结果为:
e is [BTC ETH EOS]
f is [QTUM ETH EOS]
同样,当数组作为参数传递给函数时,他们是按值传递的,原始数组不做改变:
package main
import "fmt"
func changeLocal(num [5]int) { //定义函数 changeLocal ,输入值 num 是一个长度为 5 的整数数组
num[0] = 55 //在函数中将输入值得第一个元素改为 55
fmt.Println("inside function ", num)
}
func main() {
num := [...]int{5, 6, 7, 8, 8} //定义数组num值为{5, 6, 7, 8, 8}
fmt.Println("before passing to function ", num) //正常输出数组
changeLocal(num) //调用函数输出数组,在期间改变了第一个元素为 55
fmt.Println("after passing to function ", num) //继续正常输出数组
}
在以上程序中,13行出num
实际上是通过值传递给函数changeLocal
,原始数组不会因为函数调用而改变。
上面的程序运行结果为:
before passing to function [5 6 7 8 8]
inside function [55 6 7 8 8]
after passing to function [5 6 7 8 8]
数组的长度
通过将数组传递给len
函数,可以得到数组的长度:
package main
import "fmt"
func main(){
/*数组的长度*/
g := [...]float64{55.3, 34, 0.92, 99.99, 88.8}
fmt.Println("the length of g is ", len(g)) //通过len函数得到数组 g 的长度
}
上面的程序运行结果为:the length of g is 5
使用range迭代数组
package main
import "fmt"
func main(){
/*使用range迭代数组*/
h :=[...]float64{55.3, 34, 0.92, 99.99, 88.8} //定义数组 h
sum := float64(0) //定义变量 sum
for i, v := range h{ //range返回两个值:索引和该索引处的值,第一次循环返回 0 和 55.3 ,分别赋值给 i 和 v
fmt.Printf("\nthe %d value is %.2f", i, v)
sum += v //将 v 的值加起来
}
fmt.Println("\nsum of all values is", sum)
}
上述程序的for i, v := range h
利用的是 for 循环 range 方式。 它将返回索引和该索引处的值。 我们打印这些值,并计算数组 h 中所有元素的总和。
上面的程序运行结果为:
the 0 value is 55.30
the 1 value is 34.00
the 2 value is 0.92
the 3 value is 99.99
the 4 value is 88.80
sum of all values is 279.01
如果只需要值而不需要索引,可以使用_
空白标识符替换索引:
for _, v := range h { // 忽略range的索引
}
上面的 for 循环忽略索引,同样值也可以被忽略。
以上为学习Golang 数组篇,下一篇学习切片的应用