1. 程式人生 > >GO語言學習(十四)Go 語言數組

GO語言學習(十四)Go 語言數組

brush 多維數組 type 本質 數據結構 com 循環 方式 整型

Go 語言數組

Go 語言提供了數組類型的數據結構。

數組是具有相同唯一類型的一組已編號且長度固定的數據項序列,這種類型可以是任意的原始類型例如整形、字符串或者自定義類型。

相對於去聲明number0, number1, ..., and number99的變量,使用數組形式numbers[0], numbers[1] ..., numbers[99]更加方便且易於擴展。

數組元素可以通過索引(位置)來讀取(或者修改),索引從0開始,第一個元素索引為 0,第二個索引為 1,以此類推。

技術分享圖片

聲明數組

Go 語言數組聲明需要指定元素類型及元素個數,語法格式如下:

var variable_name [SIZE] variable_type

初始化數組

以下演示了數組初始化:

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,以此類推。

技術分享圖片

訪問數組元素

數組元素可以通過索引(位置)來讀取。格式為數組名後加中括號,中括號中為索引的值。例如:

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("Element[%d] = %d\n", j, n[j] )
   }
}

以上實例執行結果如下:

Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109

更多內容

數組對 Go 語言來說是非常重要的,以下我們將介紹數組更多的內容:

內容描述
多維數組 Go 語言支持多維數組,最簡單的多維數組是二維數組
向函數傳遞數組 你可以向函數傳遞數組參數

多維數組

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 */
}
//註意:以上代碼中倒數第二行的 } 必須要有逗號,因為最後一行的 } 不能單獨一行,也可以寫成這樣:
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,0}, {1,2}, {2,4}, {3,6},{4,8}}
   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] = 0
a[1][0] = 1
a[1][1] = 2
a[2][0] = 2
a[2][1] = 4
a[3][0] = 3
a[3][1] = 6
a[4][0] = 4
a[4][1] = 8

向函數傳遞數組

如果你想向函數傳遞數組參數,你需要在函數定義時,聲明形參為數組,我們可以通過以下兩種方式來聲明:

方式一

形參設定數組大小:

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;
}
如果你想向函數傳遞數組參數,你需要在函數定義時,聲明形參為數組,我們可以通過以下兩種方式來聲明:
方式一

形參設定數組大小:
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 {1000, 2, 3, 17, 50}
   var avg float32

   /* 數組作為參數傳遞給函數 */
   avg = getAverage( balance, 5 ) ;

   /* 輸出返回的平均值 */
   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;
}
平均值為: 214.399994

以上實例中我們使用的形參並為設定數組大小。

浮點數計算輸出有一定的偏差,你也可以轉整型來設置精度。

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

  

GO語言學習(十四)Go 語言數組