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) // 显示
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值