Go 语言数组
Go 语言提供了数组类型的数据结构。
数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。
相对于去声明 number0, number1, ..., number99 的变量,使用数组形式 numbers[0], numbers[1] ..., numbers[99] 更加方便且易于扩展。
数组元素可以通过索引(位置)来读取(或者修改),索引从 0 开始,第一个元素索引为 0,第二个索引为 1,以此类推。

声明数组
Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:
var arrayName [size]dataType其中,arrayName 是数组的名称,size 是数组的大小,dataType 是数组中元素的数据类型。
以下定义了数组 balance 长度为 10 类型为 float32:
var balance [10]float32
初始化数组
以下演示了数组初始化:
以下实例声明一个名为 numbers 的整数数组,其大小为 5,在声明时,数组中的每个元素都会根据其数据类型进行默认初始化,对于整数类型,初始值为 0。
var numbers [5]int
还可以使用初始化列表来初始化数组的元素:
var numbers = [5]int{1, 2, 3, 4, 5}
以上代码声明一个大小为 5 的整数数组,并将其中的元素分别初始化为 1、2、3、4 和 5。
另外,还可以使用 := 简短声明语法来声明和初始化数组:
numbers := [5]int{1, 2, 3, 4, 5}
以上代码创建一个名为 numbers 的整数数组,并将其大小设置为 5,并初始化元素的值。
注意:在 Go 语言中,数组的大小是类型的一部分,因此不同大小的数组是不兼容的,也就是说 [5]int 和 [10]int 是不同的类型。
以下定义了数组 balance 长度为 5 类型为 float32,并初始化数组的元素:
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
我们也可以通过字面量在声明数组的同时快速初始化数组:
balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
如果数组长度不确定,可以使用 ... 代替数组的长度,编译器会根据元素个数自行推断数组的长度:
var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
或
balance := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
如果设置了数组的长度,我们还可以通过指定下标来初始化元素:
// 将索引为 1 和 3 的元素初始化
balance := [5]float32{1:2.0,3:7.0}
初始化数组中 {} 中的元素个数不能大于 [] 中的数字。
如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小:
balance[4] = 50.0
以上实例读取了第五个元素。数组元素可以通过索引(位置)来读取(或者修改),索引从 0 开始,第一个元素索引为 0,第二个索引为 1,以此类推。

访问数组元素
数组元素可以通过索引(位置)来读取。格式为数组名后加中括号,中括号中为索引的值。例如:
var salary float32 = balance[9]
以上实例读取了数组 balance 第 10 个元素的值。
以下演示了数组完整操作(声明、赋值、访问)的实例:
实例 1
import "fmt"
func main() {
var n [10]int /* n 是一个长度为 10 的数组 */
var i,j int
/* 为数组 n 初始化元素 */
for i = 0; i < 10; i++ {
n[i] = i + 100 /* 设置元素为 i + 100 */
}
/* 输出每个数组元素的值 */
for j = 0; j < 10; j++ {
fmt.Printf("Element[%d] = %d\n", j, n[j] )
}
}
以上实例执行结果如下:
Element[0] = 100 Element[1] = 101 Element[2] = 102 Element[3] = 103 Element[4] = 104 Element[5] = 105 Element[6] = 106 Element[7] = 107 Element[8] = 108 Element[9] = 109
实例 2
import "fmt"
func main() {
var i,j,k int
// 声明数组的同时快速初始化数组
balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
/* 输出数组元素 */ ...
for i = 0; i < 5; i++ {
fmt.Printf("balance[%d] = %f\n", i, balance[i] )
}
balance2 := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
/* 输出每个数组元素的值 */
for j = 0; j < 5; j++ {
fmt.Printf("balance2[%d] = %f\n", j, balance2[j] )
}
// 将索引为 1 和 3 的元素初始化
balance3 := [5]float32{1:2.0,3:7.0}
for k = 0; k < 5; k++ {
fmt.Printf("balance3[%d] = %f\n", k, balance3[k] )
}
}
以上实例执行结果如下:
balance[0] = 1000.000000 balance[1] = 2.000000 balance[2] = 3.400000 balance[3] = 7.000000 balance[4] = 50.000000 balance2[0] = 1000.000000 balance2[1] = 2.000000 balance2[2] = 3.400000 balance2[3] = 7.000000 balance2[4] = 50.000000 balance3[0] = 0.000000 balance3[1] = 2.000000 balance3[2] = 0.000000 balance3[3] = 7.000000 balance3[4] = 0.000000
更多内容
数组对 Go 语言来说是非常重要的,以下我们将介绍数组更多的内容:
| 内容 | 描述 |
|---|---|
| 多维数组 | Go 语言支持多维数组,最简单的多维数组是二维数组 |
| 向函数传递数组 | 你可以向函数传递数组参数 |
Diya
xio***ayong@foxmail.com
使用数组来打印杨辉三角
根据上一行的内容,来获取下一行的内容并打印出来。
package main import "fmt" func GetYangHuiTriangleNextLine(inArr []int) []int { var out []int var i int arrLen := len(inArr) out = append(out, 1) if 0 == arrLen { return out } for i = 0; i < arrLen-1; i++ { out = append(out, inArr[i]+inArr[i+1]) } out = append(out, 1) return out } func main() { nums := []int{} var i int for i = 0; i < 10; i++ { nums = GetYangHuiTriangleNextLine(nums) fmt.Println(nums) } }输出结果为:
Diya
xio***ayong@foxmail.com
初学者小在在
olc***se@sina.cn
我也来一个杨辉三角:
package main import "fmt" func triangle(n int) { var item []int for i:=1;i<=n;i++ { item_len:=len(item) if item_len==0 { item = append(item,1) } else { temp_s := []int{1} for j:=0;j<item_len-1;j++ { temp_s=append(temp_s,item[j]+item[j+1]) } temp_s=append(temp_s,1) item = temp_s } fmt.Println(item) } } func main(){ triangle(13) }初学者小在在
olc***se@sina.cn
kam
156***8447@qq.com
那我也来输出一个杨辉三角吧:
package main import "fmt" func main() { yanghuisanjiao(12) } func yanghuisanjiao(rows int) { for i := 0; i < rows; i++ { number := 1; for k := 0; k < rows-i; k++ { fmt.Print(" ") } for j := 0; j <= i; j++ { fmt.Printf("%5d", number) number = number * (i - j) / (j + 1); } fmt.Println() } }打印结果:
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 1 10 45 120 210 252 210 120 45 10 1 1 11 55 165 330 462 462 330 165 55 11 1kam
156***8447@qq.com
还没吃饱
160***3328@qq.com
参考地址
数组初始化
初始化数组的初始化有多种形式。
[5] int {1,2,3,4,5}长度为5的数组,其元素值依次为:1,2,3,4,5。
[5] int {1,2}长度为 5 的数组,其元素值依次为:1,2,0,0,0 。
在初始化时没有指定初值的元素将会赋值为其元素类型 int 的默认值0,string 的默认值是 ""。
[...] int {1,2,3,4,5}长度为 5 的数组,其长度是根据初始化时指定的元素个数决定的。
[5] int { 2:1,3:2,4:3}长度为 5 的数组,key:value,其元素值依次为:0,0,1,2,3。在初始化时指定了 2,3,4 索引中对应的值:1,2,3
[...] int {2:1,4:3}长度为5的数组,起元素值依次为:0,0,1,0,3。由于指定了最大索引 4 对应的值 3,根据初始化的元素个 数确定其长度为5赋值与使用。
切片的初始化
切片可以通过数组来初始化,也可以通过内置函数 make() 初始化。
初始化时 len=cap,在追加元素时如果容量 cap 不足时将按 len 的 2 倍扩容。
s :=[] int {1,2,3 } 直接初始化切片,[] 表示是切片类型,{1,2,3} 初始化值依次是 1,2,3。其 cap=len=3。
s := arr[:] 初始化切片 s,是数组 arr 的引用。
s := arr[startIndex:endIndex] 将 arr 中从下标 startIndex 到 endIndex-1 下的元素创建为一个新的切片。
s := arr[startIndex:] 缺省 endIndex 时将表示一直到 arr 的最后一个元素。
s := arr[:endIndex] 缺省 startIndex 时将表示从 arr 的第一个元素开始。
s1 := s[startIndex:endIndex] 通过切片 s 初始化切片 s1
s :=make([]int,len,cap) 通过内置函数 make() 初始化切片 s,[]int 标识为其元素类型为 int 的切片。
还没吃饱
160***3328@qq.com
参考地址
文火火
403***793@qq.com
遍历二维数组可以用 range:
package main import ( "fmt" ) func main() { // 二维数组 var value = [3][2]int{{1, 2}, {3, 4}, {5, 6}} // 遍历二维数组的其他方法,使用 range // 其实,这里的 i, j 表示行游标和列游标 // v2 就是具体的每一个元素 // v 就是每一行的所有元素 for i, v := range value { for j, v2 := range v { fmt.Printf("value[%v][%v]=%v \t ", i, j, v2) } fmt.Print(v) fmt.Println() } }输出结果为:
文火火
403***793@qq.com