Go 学习笔记-数组

package main

import "fmt"

/*
 * 一维数组:var variable_name [SIZE] variable_type
 * 一维数组初始化:
 *     固定长度:var variable_name = [SIZE] variable_type {value1, value2, ..., valueSIZE}
 *     根据内容:var variable_name = [...] variable_type {value1, value2, ...}
 *
 * 多维数组:var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
 * 多维数组初始化:
 *     固定长度:var variable_name = [SIZE1][SIZE2]...[SIZEN] variable_type {{raw1_value1, raw1_value2, ...}, {raw2_value1, raw2_value2, ...}, {...}}
 *     根据内容:var variable_name = [][]...[] variable_type {{raw1_value1, raw1_value2, ...}, {raw2_value1, raw2_value2, ...}, {...}}
 * 
 */ 

// 声明长度与内容相等的数组
// 初始化数组中 {} 中的元素个数不能大于 [] 中的数字。
// 如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小:
var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

/*
 * 函数调用传递数组参数
 * 方式1:不指定数组长度,由外部传入
 */
func getAverage(arr []int, size int) float32 {
   var i, sum int
   var avg float32  

   for i = 0; i < size; i++ {	// go 的语法不允许 ++i
      sum += arr[i]
   }

   avg = (float32)(sum / size)

   return avg
}

/*
 * 函数调用传递数组参数
 * 方式2:指定数组长度
 * 数组声明指定数组长度时,要求传入数组在声明时也必须有相同的长度,
 * 当声明指定长度时,则可以省略数组长度的参数,只保留一个数组即可。
 */
func getAverageSpecialLen(arr [4]int) float32 {
	var i, sum int
	var avg float32  

	for i = 0; i < len(arr); i++ {
		sum += arr[i]
	}

	// 所有的变量赋值,如果涉及类型转换,必须显示进行类型转换,否则编译失败,提示语法错误。
	avg = (float32)(sum / len(arr))

	return avg
}

// 获取二维数组的平均值
func getAverageMulti(arr [][]int, rowNum int, colNum int) float32{
	var i, j, sum int
	var avg float32

	for i = 0; i < rowNum; i++ {
		for j = 0; j < colNum; j++ {
			// 多维数组的操作方式,通过下标操作 variable_name [一维索引][二维索引]...[N维索引]
			sum += arr[i][j]
		}
	}

	avg = (float32)(sum / rowNum / colNum)

	return avg
}

// 获取二维数组的平均值,通过引用传递数组获取每行平均值
// 注意引用传递数组的表达方式:variable_name *[] variable_type
// 引用传递数组,必须给定数组长度,否则无法使用 avgs[index] 的方式赋值
func getAverageMultiRef(arr [3][4]int, avgs *[3] float32){
	var i, j, sum int

	rowNum := len(arr)
	colNum := len(arr[0])

	for i = 0; i < rowNum; i++ {
		sum = 0
		for j = 0; j < colNum; j++ {
			sum += arr[i][j]
		}

		// 声明 avgs 为引用传递,操作引用数组时不需要使用 *avgs[] 的方式来操作,直接使用 avgs[index] 即可。
		avgs[i] = (float32)(sum / colNum)
	}
}

func main() {
	fmt.Println("array")

	fmt.Println(balance, len(balance))

	var balanceInt = []int {1000, 2, 3, 17, 50}
	average := getAverage(balanceInt, len(balanceInt))
	fmt.Println("getAverage = ", average)

	var balanceIntLen = [4]int {1000, 2, 3, 17}
	averageLen := getAverageSpecialLen(balanceIntLen)
	fmt.Println("getAverageSpecialLen = ", averageLen)

	var balanceMulti = [][]int {{1000, 2, 3, 17}, {1, 3, 5, 7}, {2, 4, 6, 8}}
	fmt.Println("raw count=", len(balanceMulti), ", col count=", len(balanceMulti[0]))
	fmt.Println("getAverageMulti=", getAverageMulti(balanceMulti, len(balanceMulti), len(balanceMulti[0])))

	var balanceMultiRef = [3][4]int {{1000, 2, 3, 17}, {1, 3, 5, 7}, {2, 4, 6, 8}}
	var averageMultiRef [3] float32
	// 引用传递数组,使用标识符 &
	getAverageMultiRef(balanceMultiRef, &averageMultiRef)
	for i := 0; i < len(averageMultiRef); i++ {
		fmt.Println("line", i, "average=", averageMultiRef[i])
	}
}

输出结果

array
[1000 2 3.4 7 50] 5
getAverage =  214
getAverageSpecialLen =  255
raw count= 3 , col count= 4
getAverageMulti= 88
line 0 average= 255
line 1 average= 4
line 2 average= 5

参考链接

Go 语言数组

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章