陣列 (Array)

陣列是零或多個特定型別元素的固定長度序列。由於他們是固定長度,比較少直接使用。

基礎使用

  var a [3]int                // 三個整數的陣列
  fmt.Println(a[0])           // 輸出第一個元素
  fmt.Println(a[len(a)-1])    // 輸出最後一個元素

新陣列變數以元素型別的零值初始化,對 int 來說是 0 。

  var r [3]int = [3]int{1, 2}
  fmt.Println(r[2])     // 0

陣列長度可以使用 … 來取代,但會依初始化長度來決定。

  q := [...]int{1, 2, 3}
  fmt.Printf("%T\n", q)  // "[3]int"

陣列的大小也是型別的一部份

  q := [3]int {1, 2, 3}
  q = [4]int {1, 2, 3, 4}
  // 編譯錯誤

陣列也可以指定成 key map 型態

  type Currency int
  const (
    USD Currency = iota
    EUR
    GBP
    RMB
  )
  symbol := [...]string{USD: "$", EUR: "€", GBP: "£", RMB: "¥"}
  fmt.Println(RMB, symbol[RMB]) // 3 ¥

如果陣列中的元素是可比較的,那該陣列就是可比較的。我們可以使用 == 來比較兩個陣列(它會回報陣列內的元素是否皆相同)

  a := [2]int{1, 2}
  b := [...]int{1, 2}
  c := [2]int{1,3}
  fmt.Println(a==b, a==c, b==c) // "true false, false"
  d := [3]int{1, 2}
  fmt.Println(a == b) // 編譯錯誤

在 Go 中,呼叫函式(function)時,每個參數值的拷貝被指派給相對應的參數變數,因此函式接收到的是複製品而不是來源。

  p := [2]int{1, 2}
  func zero(intArray [2]int){
    for i := range intArray {
        intArray[i] = 0
    }
  }
  zero(p)
  fmt.Println(p)
  // [1, 2]

所以在 Golang 中我們通常這樣使用

  p := [2]int{1, 2}
  func zero(intArray *[2]int){
    for i := range intArray {
        intArray[i] = 0
    }
  }
  zero(&p)
  fmt.Println(p)
 // [0, 0]