Golang——11_数组

11 数组

        Go 语言提供了数组类型的数据结构。

        数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。

        相对于去声明number0, number1, ..., and number99的变量,使用数组形式numbers[0], numbers[1] ..., numbers[99]更加方便且易于扩展。

        数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素索引为 0,第二个索引为 1,以此类推。



11.1 声明数组

        Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:

var variable_name [SIZE] variable_type

        以上为一维数组的定义方式。数组长度必须是整数且大于 0。

        例如以下定义了数组 balance 长度为 10 类型为 float32:

var balance [10] float


11.2 初始化数组

        以下演示了数组初始化:

var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

        初始化数组中 {} 中的元素个数不能大于 [] 中的数字。

        如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小:

var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

        该实例与上面的实例是一样的,虽然没有设置数组的大小。

balance[4] = 50.0

        以上实例读取了第五个元素。数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素索引为 0,第二个索引为 1,以此类推。



11.3 访问数组元素

        数组元素可以通过索引(位置)来读取。格式为数组名后加中括号,中括号中为索引的值。例如:

salary := 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 /* 设置元素为 i */
	}

	/* 输出每个数组元素的值 */
	for j = 0; j < 10; j++ {
		fmt.Printf("Element[%d] = %d\n", j, n[j] )
	}
	
}

        以上实例执行结果如下:

Element[0] = 0
Element[1] = 1
Element[2] = 2
Element[3] = 3
Element[4] = 4
Element[5] = 5
Element[6] = 6
Element[7] = 7
Element[8] = 8
Element[9] = 9


11.4 更多内容

        数组对 Go 语言来说是非常重要的,以下我们将介绍数组更多的内容:

内容描述
多维数组Go 语言支持多维数组,最简单的多维数组是二维数组
向函数传递数组可以向函数传递数组参数

11.4.1 多维数组

        Go 语言支持多维数组,以下为常用的多维数组声明方式:

var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type

        以下实例声明了三维的整型数组:

var threedim [5][10][4]int

二维数组

        二维数组是最简单的多维数组,二维数组本质上是由一维数组组成的。二维数组定义方式如下:

var arrayName [ x ][ y ] variable_type

        variable_type 为 Go 语言的数据类型,arrayName 为数组名,二维数组可认为是一个表格,x 为行,y 为列,下图演示了一个二维数组 a 为三行四列:


        二维数组中的元素可通过 a[ i ][ j ] 来访问。

初始化二维数组

        多维数组可通过大括号来初始值。以下实例为一个 3 行 4 列的二维数组:

a = [3][4]int{  
 {0, 1, 2, 3} ,   /*  第一行索引为 0 */
 {4, 5, 6, 7} ,   /*  第二行索引为 1 */
 {8, 9, 10, 11}   /*  第三行索引为 2 */
}

访问二维数组

        二维数组通过指定坐标来访问。如数组中的行索引与列索引,例如:

int val = a[2][3]

        以上实例访问了二维数组 val 第三行的第四个元素。

        二维数组可以使用循环嵌套来输出元素:

package main

import "fmt"

func main() {
	/* 数组 - 5 行 2 列*/
	var a = [5][2]int{ {0,1}, {2,3}, {4,5}, {6,7},{8,9}}
	var i, j int

	/* 输出数组元素 */
	for  i = 0; i < 5; i++ {
		for j = 0; j < 2; j++ {
			fmt.Printf("a[%d][%d] = %d\n", i,j, a[i][j] )
		}
	}
}

        以上实例运行输出结果为:

a[0][0] = 0
a[0][1] = 1
a[1][0] = 2
a[1][1] = 3
a[2][0] = 4
a[2][1] = 5
a[3][0] = 6
a[3][1] = 7
a[4][0] = 8
a[4][1] = 9

11.4.2 向函数传递数组

        如果你想向函数传递数组参数,你需要在函数定义时,声明形参为数组,我们可以通过以下两种方式来声明:

方式一

        形参设定数组大小:

void myFunction(param [10]int)
{
...
}

方式二

        形参未设定数组大小:

void myFunction(param []int)
{
...
}

实例

        让我们看下以下实例,实例中函数接收整型数组参数,另一个参数指定了数组元素的个数,并返回平均值:

func getAverage(arr []int, size int) float32
{
   var i int
   var avg, sum float32  

   for i = 0; i < size; i++ {
      sum += arr[i]
   }

   avg = sum / size

   return avg
}

        接下来我们来调用这个函数:

package main

import "fmt"

func main() {
	/* 数组长度为 5 */
	var  balance = []int {100, 2, 3, 17, 50}
	var avg float32

	/* 数组作为参数传递给函数 */
	avg = getAverage( balance, len(balance) ) ;

	/* 输出返回的平均值 */
	fmt.Printf( "平均值为: %f ", avg );
}

func getAverage(arr []int, size int) float32 {
	var i,sum int
	var avg float32

	for i = 0; i < size;i++ {
		sum += arr[i]
	}

	avg = float32(sum) / float32(size)

	return avg
}

        以上实例执行输出结果为:

平均值为: 34.400002 

        以上实例中我们使用形参并为之求出设定数组大小。

        浮点数计算输出有一定的偏差,你也可以转整型来设置精度。

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) // 显示
}


新浪微博:古老医麦

技术交流论坛:http://www.yinchengxueyuan.com/forum.php


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值