数组
约 1068 字大约 4 分钟
2025-07-04
数组
声明数组语法格式 var variable_name [SIZE] variable_type
使用:var nameArr [10] string
定义了一个长度为10,类型为string
的数组
数组初始化
一维数组
代码示例
package main
import (
"fmt"
)
// 全局变量
var arr0 [5]int = [5]int{1, 2, 3}
var arr1 = [5]int{1, 2, 3, 4, 5}
var arr2 = [...]int{1, 2, 3, 4, 5, 6}
var strArr1 = [2]string{"sreio", "docs"}
var strArr2 = [5]string{3: "hello world", 4: "sreio"}
func main() {
// 局部变量
a := [3]int{1, 2} // 未初始化元素值为 0。
b := [...]int{1, 2, 3, 4} // 通过初始化值确定数组长度。
c := [5]int{2: 100, 4: 200} // 使用引号初始化元素。
d := [...]struct {
name string
age uint8
}{
{"user1", 10}, // 可省略元素类型。
{"user2", 20}, // 别忘了最后一行的逗号。
}
fmt.Println(arr0, arr1, arr2, strArr1, strArr2)
fmt.Println(a, b, c, d)
}
/**
输出
[1 2 3 0 0] [1 2 3 4 5] [1 2 3 4 5 6] [sreio docs] [ hello world sreio]
[1 2 0] [1 2 3 4] [0 0 100 0 200] [{user1 10} {user2 20}]
*/
多维数组
代码示例
package main
import (
"fmt"
)
var arr0 [5][3]int // 代表最外围数组长度是5 每个二维数组长度是3 而int默认值是0 所以会被初始化为0
var arr1 [2][3]int = [...][3]int{{1, 2, 3}, {7, 8, 9}}
func main() {
a := [2][3]int{{1, 2, 3}, {4, 5, 6}}
b := [...][2]int{{1, 1}, {2, 2}, {3, 3}} // 第 2 纬度不能用 "..."。
fmt.Println(arr0)
fmt.Println(arr1)
fmt.Println(a)
fmt.Println(b)
}
/**
输出
[[0 0 0] [0 0 0] [0 0 0] [0 0 0] [0 0 0]]
[[1 2 3] [7 8 9]]
[[1 2 3] [4 5 6]]
[[1 1] [2 2] [3 3]]
*/
值拷贝行为会造成性能问题,通常会建议使用 slice
,或数组指针
。
代码示例
package main
import (
"fmt"
)
func test(x [2]int) {
fmt.Printf("x: %p\n", &x)
x[1] = 1000
}
func main() {
a := [2]int{}
fmt.Printf("a: %p\n", &a)
test(a)
fmt.Println(a)
}
/**
输出(每个人电脑内存地址不同)
a: 0xc000016060
x: 0xc000016090
[0 0]
*/
内置函数 len
和 cap
都返回数组长度 (元素数量)。
代码示例
package main
func main() {
a := [2]int{}
println(len(a), cap(a))
}
// 2 2
多维数组遍历:
代码示例
package main
import (
"fmt"
)
func main() {
var f [2][3]int = [...][3]int{{1, 2, 3}, {7, 8, 9}}
for k1, v1 := range f {
for k2, v2 := range v1 {
fmt.Printf("(%d,%d)=%d ", k1, k2, v2)
}
fmt.Println()
}
}
/**
(0,0)=1 (0,1)=2 (0,2)=3
(1,0)=7 (1,1)=8 (1,2)=9
*/
数组拷贝和传参
代码示例
package main
import "fmt"
func printArr(arr *[5]int) { //接收一个长度为5的 int类型的数组 并使用这个数组的指针
arr[0] = 10 // 下标为0的参数改为10
for i, v := range arr {
fmt.Println(i, v) //循环打印
}
}
func main() {
var arr1 [5]int // 定义长度为5的一维int数组
printArr(&arr1) //将数组地址传过去
fmt.Println(arr1)
arr2 := [...]int{2, 4, 6, 8, 10}
printArr(&arr2)
fmt.Println(arr2)
}
/** 结果
0 10
1 0
2 0
3 0
4 0
[10 0 0 0 0]
0 10
1 4
2 6
3 8
4 10
[10 4 6 8 10]
*/
数组练习
求数组所有元素之和
代码示例
package main
import (
"fmt"
"math/rand"
"time"
)
// 求元素和
func sumArr(a [10]int) int {
var sum int = 0
for i := 0; i < len(a); i++ {
sum += a[i]
}
return sum
}
func main() {
// 若想做一个真正的随机数,要种子
// seed()种子默认是1
//rand.Seed(1)
rand.Seed(time.Now().Unix())
var b [10]int
for i := 0; i < len(b); i++ {
// 产生一个0到1000随机数
b[i] = rand.Intn(1000)
}
sum := sumArr(b)
fmt.Printf("sum=%d\n", sum)
}
找出数组中和为给定值的两个元素的下标,例如数组[1,3,5,8,7],找出两个元素之和等于8的下标分别是(0,4)和(1,2)
代码示例
package main
import "fmt"
// 找出数组中和为给定值的两个元素的下标,例如数组[1,3,5,8,7],
// 找出两个元素之和等于8的下标分别是(0,4)和(1,2)
// 求元素和,是给定的值
func myTest(a [5]int, target int) {
// 遍历数组
for i := 0; i < len(a); i++ {
other := target - a[i]
// 继续遍历
for j := i + 1; j < len(a); j++ {
if a[j] == other {
fmt.Printf("(%d,%d)\n", i, j)
}
}
}
}
func main() {
b := [5]int{1, 3, 5, 8, 7}
myTest(b, 8)
}
贡献者
更新日志
2025/7/4 07:21
查看所有更新日志
0d7a0
-go基础于