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 語言數組

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