go语言数组
Go 语言数组
Go 语言提供了数组类型的数据结构。
数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。
相对于去声明 number0, number1, ..., number99 的变量,使用数组形式 numbers[0], numbers[1] ..., numbers[99] 更加方便且易于扩展。
数组元素可以通过索引(位置)来读取(或者修改),索引从 0 开始,第一个元素索引为 0,第二个索引为 1,以此类推。
声明数组
Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:
复制var variable_name [SIZE] variable_type
以上为一维数组的定义方式。例如以下定义了数组 balance 长度为 10 类型为 float32:
复制var balance [10] 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}
初始化数组中 {} 中的元素个数不能大于 [] 中的数字。
如果设置了数组长度,但是{} 中的元素个数没有达到,则会使用数据类型默认值填充。int 类型使用0填充,string类型使用空 填充
如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小:
复制 balance[4] = 50.0
以上实例读取了第五个元素。数组元素可以通过索引(位置)来读取(或者修改),索引从 0 开始,第一个元素索引为 0,第二个索引为 1,以此类推。
访问数组元素
数组元素可以通过索引(位置)来读取。格式为数组名后加中括号,中括号中为索引的值。例如:
复制var salary float32 = balance[9]
以上实例读取了数组 balance 第 10 个元素的值。
以下演示了数组完整操作(声明、赋值、访问)的实例:
复制package main
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("number[%d] = %d\n", j, n[j] )
}
}
//输出结果:
number[0] = 100
number[1] = 101
number[2] = 102
number[3] = 103
number[4] = 104
number[5] = 105
number[6] = 106
number[7] = 107
number[8] = 108
number[9] = 109
复制package main
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
复制package main
import (
"fmt"
)
//数组定义.数组名Arry,数组元素最多10个, 元素的数据类型是int
// 当前数组里有10个元素,所以数组的长度是10
//当定义了数组元素10个,但是数组里写的元素并没有10个,剩下的就会一数据类型的默认值补充
var Arry = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
//不固定长度的数组
var a = [...]int{1, 2, 3, 4}
func main() {
//数组元素,通过下标进行提取
//fmt.Println(Arry[0])
//fmt.Println(Arry[9])
// 数组元素的遍历
for i := 0; i < 10; i++ {
fmt.Println(Arry[i])
}
//输出数组长度
fmt.Println("数组的长度是:", len(Arry))
//遍历不固定长度的数组
for j := 0; j < len(a); j++ {
fmt.Println(a[j])
}
}
//输出结果:
1
2
3
4
5
6
7
8
9
10
数组的长度是: 10
1
2
3
4
求数组最大值
复制//用户随意输入5个整数,求出输入的最大值
package main
import "fmt"
var arrar [2]int
func main() {
var tmp int
fmt.Println("请输入第1位数字")
fmt.Scan(&tmp)
arrar[0] = tmp
for i := 2; i <= 5; i++ {
fmt.Printf("请输入第%d个数字\n", i)
fmt.Scan(&tmp)
if tmp > arrar[0] {
arrar[0] = tmp
}
}
fmt.Printf("最大的数是%d", arrar[0])
}
冒泡排序
原理:
复制package main
import "fmt"
func main() {
var (
tmp int
arrar [5]int
)
for i := 1; i <= len(arrar); i++ {
fmt.Printf("请输入第%d个数字:\n", i)
fmt.Scan(&tmp)
arrar[i-1] = tmp
}
fmt.Println("排序前的数组是:", arrar)
//开始冒泡排序。外层循环控制比较轮数,总轮数为数组长度-1
for i := 1; i < len(arrar); i++ {
//内层循环控制每轮比较次数。为 数组长度 - 比较轮数
for j := 1; j <= len(arrar)-i; j++ {
//进行比较,较大的数向后移动
if arrar[j-1] > arrar[j] {
//交换两数数值
arrar[j-1], arrar[j] = arrar[j], arrar[j-1]
}
}
}
fmt.Println("排序后的数组是:", arrar)
}
复制package main
import "fmt"
func main() {
result()
}
func input() (v [5]int) {
var (
tmp int
arrar [5]int
)
for i := 1; i <= len(arrar); i++ {
fmt.Printf("请输入第%d个数字:\n", i)
fmt.Scan(&tmp)
arrar[i-1] = tmp
}
fmt.Println("排序前的数组是:", arrar)
return arrar
}
func result() {
arrar := input()
for i := 1; i < len(arrar); i++ {
for j := 1; j <= len(arrar)-i; j++ {
if arrar[j-1] > arrar[j] {
arrar[j-1], arrar[j] = arrar[j], arrar[j-1]
}
}
}
fmt.Println("排序后的数组是:", arrar)
}
数组元素的追加
在初始化设定数组时,如果是不设定数组长度。无法使用下标的方式添加新元素。需要使用append 将元素追加到数组中
复制var arrar [] int //设定一个元素值类型为int 的数组
arrar = append(arrar,10) //将元素10 追加写入到 数组 arrar 中
复制//演示数组元素追加
package main
import "fmt"
func main() {
var (
names []string
name string
)
for i := 0; i < 5; i++ {
fmt.Printf("请输入第%d个人姓名", i+1)
fmt.Scan(&name)
//数组元素添加
names = append(names, name)
fmt.Println("添加成功")
}
fmt.Println(names)
fmt.Println("数组长度是", len(names))
}
复制//数组元素主键与冒泡排序
package main
import "fmt"
//定义一个不定长数组
var arrar []int
func main() {
var (
tmp int
)
for i := 1; i <= 10; i++ {
fmt.Printf("请输入第%d个数字:\n", i)
fmt.Scan(&tmp)
//将数值进行追加
arrar = append(arrar, tmp)
}
fmt.Println("排序后的数组是:", arrar)
//开始冒泡排序。外层循环控制比较轮数,总轮数为数组长度-1
for i := 1; i < len(arrar); i++ {
//内层循环控制每轮比较次数。为 数组长度 - 比较轮数
for j := 1; j <= len(arrar)-i; j++ {
//进行比较,较大的数向后移动
if arrar[j-1] > arrar[j] {
//交换两数数值
arrar[j-1], arrar[j] = arrar[j], arrar[j-1]
}
}
}
fmt.Println("排序后的数组是:", arrar)
}
go语言多维数组
Go 语言支持多维数组,以下为常用的多维数组声明方式:
复制var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
以下实例声明了三维的整型数组:
复制var threedim [5][10][4]int //这个三维数组有5个二维数组,每个二维数组有10个一维数组,每个一维数组里有4个元素
二维数组
二维数组是最简单的多维数组,二维数组本质上是由一维数组组成的。二维数组定义方式如下:
复制var arrayName [ x ][ y ] variable_type
variable_type 为 Go 语言的数据类型,arrayName 为数组名,二维数组可认为是一个表格,x 为行,y 为列,下图演示了一个二维数组 a 为三行四列:
二维数组中的元素可通过 a[ i ][j] 来访问。
复制package main
import "fmt"
func main() {
// Step 1: 创建数组
values := [][]int{}
// Step 2: 使用 append() 函数向空的二维数组添加两行一维数组
row1 := []int{1, 2, 3}
row2 := []int{4, 5, 6}
values = append(values, row1)
values = append(values, row2)
// Step 3: 显示两行数据
fmt.Println("Row 1")
fmt.Println(values[0])
fmt.Println("Row 2")
fmt.Println(values[1])
// Step 4: 访问第一个元素
fmt.Println("第一个元素为:")
fmt.Println(values[0][0])
}
//输出结果
Row 1
[1 2 3]
Row 2
[4 5 6]
第一个元素为:
1
初始化二维数组
多维数组可通过大括号来初始值。以下实例为一个 3 行 4 列的二维数组:
复制a := [3][4]int{
{0, 1, 2, 3} , /* 第一行索引为 0 */
{4, 5, 6, 7} , /* 第二行索引为 1 */
{8, 9, 10, 11}, /* 第三行索引为 2 */
}
注意:
以上代码中倒数第二行的 } 必须要有逗号,因为最后一行的 } 不能单独一行,也可以写成这样:
复制a := [3][4]int{ {0, 1, 2, 3} , /* 第一行索引为 0 */ {4, 5, 6, 7} , /* 第二行索引为 1 */ {8, 9, 10, 11}} /* 第三行索引为 2 */
以下实例初始化一个 2 行 2 列 的二维数组:
复制package main
import "fmt"
func main() {
//创建二维数组。拥有2个一维数组,每个一维数组有2个元素
arrar := [2][2]string{}
//向二维数组添加元素
arrar[0][0] = "a"
arrar[0][1] = "b"
arrar[1][0] = "c"
arrar[1][1] = "d"
//显示二维数组array
fmt.Println(arrar)
}
//输出结果:
[[a b] [c d]]
访问二维数组
二维数组通过指定坐标来访问。如数组中的行索引与列索引。访问了二维数组 val 第三行的第四个元素:
复制val := a[2][3]
或
var value int = a[2][3]
复制package main
import "fmt"
func main() {
// 定义一个2 行3 列的二维数组
var arr = [2][3]int{{1, 2, 3}, {2, 3, 4}}
//获取数组第一行,第一列的元素
fmt.Println(arr[0][0])
//获取数组第二行,第三列的元素
fmt.Println(arr[1][2])
}
//输出结果:
1
4
二维数组可以使用循环嵌套来输出元素:
复制//通过双重循环,获取二维数组的行下标和列下标,来输出元素
package main
import "fmt"
func main() {
var arr = [2][3]int{
{1, 2, 3},
{4, 5, 6},
}
//外层循环表示行,获取行的下标
for j := 0; j < 2; j++ {
fmt.Printf("第%d行元素有:\n", j+1)
//内层循环表示列,获取列的下标
for k := 0; k < 3; k++ {
fmt.Printf("arr[%d][%d]=%d\n", j, k, arr[j][k])
}
fmt.Println()
}
}
//输出结果:
第1行元素有:
arr[0][0]=1
arr[0][1]=2
arr[0][2]=3
第2行元素有:
arr[1][0]=4
arr[1][1]=5
arr[1][2]=6
复制//通过range遍历。先获取二维数组的一维数组, 然后在输出一维数组里的元素
package main
import "fmt"
func main() {
// 定义一个2 行3 列的二维数组
var arr = [2][3]int{{1, 2, 3}, {4, 5, 6}}
//使用range 进行遍历二维数组。
//获取到的第一个值为二维数组下标,表示行。使用空白标识符进行舍弃
//获取到的第二个值为二维数组里的 一维数组
for _, j := range arr {
fmt.Println("j的值为", j)
fmt.Println("----------")
//此时,j就是获取到的一维数组,再次使用range进行遍历
//舍弃第一个值(数组下标),使用i 接取 第二个值,即为一维数组的元素
for _, i := range j {
fmt.Println(i)
}
}
}
//
j的值为 [1 2 3]
----------
1
2
3
j的值为 [4 5 6]
----------
4
5
6
以下实例创建各个维度元素数量不一致的多维数组:
复制package main
import "fmt"
func main() {
//创建空的二维数组
arr := [][]int{}
//创建多个长度不同的一维数组
row1 := []int{1, 2, 3, 4}
row2 := []int{60, 70}
row3 := []int{100, 200, 300}
//使用append,将一维数组作为二维数组的元素,追加到二维数组里
arr = append(arr, row1)
arr = append(arr, row2)
arr = append(arr, row3)
//输出
for i := range arr {
fmt.Printf("第%d行", i+1)
fmt.Println(arr[i])
fmt.Println()
}
}
//输出结果:
第1行[1 2 3 4]
第2行[60 70]
第3行[100 200 300]
Go 语言向函数传递数组
如果你想向函数传递数组参数,你需要在函数定义时,声明形参为数组,我们可以通过以下两种方式来声明:
方式一
形参设定数组大小:
复制void myFunction(param [10]int)
{
.
.
.
}
方式二
形参未设定数组大小:
复制void myFunction(param []int)
{
.
.
.
}
实例
函数接收整型数组参数,另一个参数指定了数组元素的个数,并返回平均值:
复制package main
import "fmt"
//定义求平均值的函数,传入两个形参。第一个形参为不定长的数组,第二个形参为元素个数
func getAverage(arr []int, num int) float32 {
var sum int
for i := 0; i < num; i++ {
sum += arr[i]
}
avg := float32(sum) / float32(num)
//将平均值作为返回值
return avg
}
func main() {
///定义一个数组
var arrar = []int{10, 20, 30, 40, 50}
//使用avg 来接收函数getAverage 的返回值。
//avg和函数返回值的数值类型要相同
//将数组和数组长度作为参数传递
avg := getAverage(arrar, 5)
fmt.Printf("平均值为:%f", avg)
}
//输出结果:
平均值为:30.000000
可以转整型来设置精度。
复制package main
import (
"fmt"
)
func main() {
a := 1.69
b := 1.7
c := a * b // 结果应该是2.873
fmt.Println(c) // 输出的是2.8729999999999998
}
设置固定精度:
复制package main
import (
"fmt"
)
func main() {
a := 1690 // 表示1.69
b := 1700 // 表示1.70
c := a * b // 结果应该是2873000表示 2.873
fmt.Println(c) // 内部编码
fmt.Println(float64(c) / 1000000) // 显示
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」