網頁

2021/6/19

Golang Array 陣列簡單範例

Go語言的Array(陣列)是固定長度的單一型態的多元素序列。


宣告array的語法為[n]T,方括弧[]內的n為整數表示array的長度,不可為負值;後接的T代表元素型態。Array宣告後長度即固定不再變動。

例如宣告一個長度10、元素型態為int的array變數a語法如下:

var a [10]int  // 宣告array長度10,元素型態int
fmt.Println(a) // [0 0 0 0 0 0 0 0 0 0]

使用內建函式len()可取得array的長度。

var a [10]int
fmt.Println(a)      // [0 0 0 0 0 0 0 0 0 0]
fmt.Println(len(a)) // 10

Array的元素位置標示稱為索引(index),從0開始遞增,也就是第一個位置元素的索引為0。在array變數的中括弧輸入索引可存取對應位置的元素值。

var ss [2]string
ss[0] = "hello" // 設定"hello"在ss陣列索引0的位置
ss[1] = "world" // 設定"world"在ss陣列索引1的位置

fmt.Println(ss)    // [hello world]
fmt.Println(ss[0]) // 取得ss陣列索引0位置的值,印出"hello"
fmt.Println(ss[1]) // 取得ss陣列索引1位置的值,印出"world"

存取的index超過陣列範圍,會編譯錯誤。

var ss [2]string   // lenth 2, index 0, 1
fmt.Println(ss[2]) // invalid array index 2 (out of bounds for 2-element array)

使用array literal宣告陣列及內容,後面使用大括弧{}在內直接定義元素的值,每個元素用逗號分隔。

ss := [2]string{"hello", "world"}
fmt.Println(ss)      // [hello world]
fmt.Println(len(ss)) // 2

Array literal可以用...符號表示長度等於定義元素的數目。

ss := [...]string{"hello", "world"}
fmt.Println(ss)      // [hello world]
fmt.Println(len(ss)) // 2

第二個方括弧代表二維陣列

ss := [2][2]string{{"hello", "world"},{"see", "you"}}
    
fmt.Println(ss)       // [[hello world] [see you]]
fmt.Println(ss[0][0]) // hello
fmt.Println(ss[0][1]) // world
fmt.Println(ss[1][0]) // see
fmt.Println(ss[1][1]) // you

宣告array型態為自訂的struct Employee並建立內容。

package main

import "fmt"

// 定義struct Employee型態
type Employee struct {
    Id int
    Name string
    Age int8
}

func main() {
    // 宣告array變數employees並建立內容
    employees := [2]Employee {
        {1, "John", 33}, 
        {2, "Mary", 28},
    }

    fmt.Println(employees) // [{1 John 33} {2 Mary 28}]
}

Go的array變數為值(value),也就是說當分配到另一變數或以參數傳遞時是把內容值複製到另一個array。例如array引數傳入函式時,函式內的array元素的異動與函式外的array無關。例如下面將array變數employees傳入clearAge()函式並將Age修改為0,但結果並不影響函式外的array內容。

package main

import "fmt"

type Employee struct {
    Id int
    Name string
    Age int8
}

func main() {
    employees := [2]Employee {
        {1, "John", 33}, 
        {2, "Mary", 28},
    }
    clearAge(employees)
    fmt.Println(employees) // [{1 John 33} {2 Mary 28}]
}

func clearAge(employees [2]Employee){
    employees[0].Age = 0
    employees[1].Age = 0 
    fmt.Println(employees) // [{1 John 0} {2 Mary 0}]
}

若希望函式內的參數array異動會影響傳入的array,則函式參數可以指標(Pointer)的方式如下。

package main

import "fmt"

type Employee struct {
    Id int
    Name string
    Age int8
}

func main() {
    employees := [2]Employee {
        {1, "John", 33}, 
        {2, "Mary", 28},
    }
    clearAge(&employees) // 以employees的指標傳入
    fmt.Println(employees)   // [{1 John 0} {2 Mary 0}]
}

// 接收指標array參數
func clearAge(employeesP *[2]Employee){
    employeesP[0].Age = 0
    employeesP[1].Age = 0 
    fmt.Println(*employeesP) // 印出指標代表的變數 [{1 John 0} {2 Mary 0}]
}

使用range走訪array如下,回傳的第一個值i為元素的index,第二個值v為元素的值。

a := [5]string{"a", "b", "c", "d", "e"}

for i, v := range a {
   fmt.Printf("index=%d, value=%s\n", i, v)
}

執行印出如下:

index=0, value=a
index=1, value=b
index=2, value=c
index=3, value=d
index=4, value=e


沒有留言:

張貼留言