📕
Go 語言程式設計入門
  • 最新消息
  • 中文版更新日誌
  • 譯者誌謝
  • 01-起步走
    • 01.01-檔案與資料夾
    • 01.02-終端機(Terminal)
    • 01.03-文字編輯器
    • 01.04-Go 的工具
  • 02-你的第一個程式
    • 02.01-如何讀 Go 程式
    • 02.02-問題
  • 03-型別
    • 03.01-數字
    • 03.02-字串
    • 03.03-問題
  • 04-變數
    • 04.01-如何命名變數
    • 04.02-Scope(變數的作用範圍)
    • 04.03-常數(Constant)
    • 04.04-定義多個變數
    • 04.05-範例程式
    • 04.06-問題
  • 05-控制結構
    • 05.01-For
    • 05.02-If
    • 05.03-switch
    • 05.04-問題
  • 06-Array、Slice 與 Map
    • 06.01-陣列(Array)
    • 06.02-Slice
    • 06.03-Map
    • 06.04-問題
  • 07-函式
    • 07.01-你的第二個函式
    • 07.02-回傳多個值
    • 07.03-參數個數可變的函式(Variadic Function)
    • 07.04-Closure
    • 07.05-遞迴(Recursive)
    • 07.06-Defer, Panic & Recover
    • 07.07-Panic & Recover
    • 07.08-問題
  • 08-指標
    • 08.01-「*」與「&」運算符號
    • 08.02-new
    • 08.03-問題
  • 09-Struct 與 Interface
    • 09.01-struct
    • 09.02-Method
    • 09.03-Interface
    • 09.04-問題
  • 10-Concurrency(平行處理)
    • 10.01-Goroutine
    • 10.02-Channel
    • 10.03-問題
  • 11-Packages
    • 11.01-建立 Package
    • 11.02-文件
    • 11.03-問題
  • 12-測試
  • 13-The Core Packages
    • 13.01-字串
    • 13.02-輸入與輸出
    • 13.03-檔案與資料夾
    • 13.04-錯誤訊息
    • 13.05-Container 與 Sort
    • 13.06-雜湊&加解密
    • 13.07-伺服器
    • 13.08-解析命令列參數
    • 13.09-Synchronization Primitives(同步處理原始物件)
  • 14-下一步
    • 14.01-閱讀大師作品
    • 14.02-動手實作
    • 14.03-團隊合作
  • 15. 附錄-額外資源
Powered by GitBook
On this page
Edit on GitHub
  1. 06-Array、Slice 與 Map

06.01-陣列(Array)

陣列是一個有著編號的序列,裡頭的每個元素(element)都有相同的單一型別(type)。在 Go 語言中,陣列的樣式看起來如下所示:

var x [5]int

x 是一個陣列的範例,由 5 個 int 型別組成,我們試著執行下列的程式:

package main

import "fmt"

func main() {
    var x [5]int
    x[4] = 100
    fmt.Println(x)
}

你應該會看到這樣的執行結果:

[0 0 0 0 100]

x[4] = 100 應該讀為「將陣列的第 5 個元素設定為 100」。可能會覺得奇怪, x[4] 為什麼代表第 5 個元素,而不是如字面所示的第 4 個元素呢?因為陣列的索引值是從 0 起算的,所以陣列的存取方式也是如此。我們可以將 fmt.Println(x) 改成 fmt.Println(x[4]),這樣我們會得到 100。

這個程式示範如何使用陣列:

func main() {
    var x [5]float64
    x[0] = 98
    x[1] = 93
    x[2] = 77
    x[3] = 82
    x[4] = 83
    
    var total float64 = 0
    for i := 0; i < 5; i++ {
        total += x[i]
    }
    fmt.Println(total / 5)
}

此程式會計算一串測驗成績的平均值,執行程式之後應該會看到結果是 86.6。我們來看看這段程式碼:

  • 我們先建立一個長度為 5 的陣列來儲存這些測驗成績,接著將分數填入每個元素中。

  • 再來使用一個迴圈來計算成績的總和。

  • 最後我們將成績的總和除以元素的數量,以取得平均值。

此程式可以正常運作,但是 Go 有提供一些功能可以讓我們來改進這個程式。在一開始的兩個地方:i < 5 與 total / 5 ,若我們想要將成績的數量從 5 個改成 6個,則會需要同時修改這兩個地方,因此建議可以改成使用陣列長度:

    var total float64 = 0
    for i := 0; i < len(x); i++ {
        total += x[i]
    }
    fmt.Println(total / len(x))

修改並執行程式,你會看到發生一個錯誤:

$ go run tmp.go
# command-line-arguments
.\tmp.go:19: invalid operation: total / 5 (mismatched types float64 and int)

問題在於 len(x) 與 total 的型別不同,total 的型別是 float64,而 len(x) 的型別是 int,所以我們需要將 len(x) 強制轉型為 float64:

fmt.Println(total / float64(len(x)))

這是一個型別轉換的範例,通常使用型別的名稱來進行型別轉換,就像是函式一樣。

另一個可以改的地方是使用特殊的 for 迴圈格式:

var total float64 = 0
for i, value := range x {
    total += value
}
fmt.Println(total / float64(len(x)))

這個 for 迴圈中的 i 表示目前正在處理的陣列元素,而 value 則與 x[i] 相同,我們使用 range 這個關鍵字,並接著一個變數名稱(迴圈的終止條件)。

執行此程式會產生另一個錯誤:

$ go run tmp.go
# command-line-arguments
.\tmp.go:16: i declared and not used

Go 編譯器(compiler)不允許你建立用不到的變數,由於我們在迴圈中沒有用到 i,所以我們要稍微修改程式碼:

var total float64 = 0
for _, value := range x {
    total += value
}
fmt.Println(total / float64(len(x)))

可以用單個 _(底線)來告知編譯器我們不需要這個變數(在此範例中,我們不需要 iterator 變數)

在 Go 可以用另一個較簡短的語法來建立陣列:

x := [5]float64{ 98, 93, 77, 82, 83 }

我們不用指定型別,因為 Go 自己知道。像這樣的陣列有時可能會太長而無法用一行來表示,所以 Go 也可以讓我們用下列方式來分行:

x := [5]float64{ 
    98, 
    93, 
    77, 
    82, 
    83,
}

要注意在 83 後面有一個結尾的 , 符號,在 Go 語言必須要這樣寫,因為這樣就能透過在前頭加上註解,隨意移除陣列元素:

x := [4]float64{ 
    98, 
    93, 
    77, 
    82, 
    // 83,
}
Previous06-Array、Slice 與 MapNext06.02-Slice

Last updated 2 years ago