初學 Golang 30 天 - (7)陣列

前面的型態的章節,我們大概簡單的學過了 Go 語言的基本型態,除了那些基本的型態之外,Go 語言還有其它種內建的型態包括陣列、切片、Map。我們分三個章節來探討它。

陣列

首先我們先介紹陣列,
如何宣告陣列呢?很簡單!只要在變數宣告後面多家 [] 就可以了,裡面要填寫宣告的陣列數字。

var x [5]int

下面是完整的範例
http://play.golang.org/p/jeNqqZN6Op

package main

import "fmt"

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

這邊來稍微說明一下

x[4] = 100

這一行的意思是說「x 的第五個元素賦予值 100」,之所以是第五個元素是因為,我們一開始用 var x [5]int 宣告了五個元素的陣列,而陣列的起始元素是第 0 個,從頭開始算 0, 1, 2, 3, 4 五個元素,所以 x[4] 表示的是第五個元素,如果要選擇第 0 個元素要寫 x[0]

接下來稍微看一個進階的例子來討論一下:

func main() {
    var x [4]float64
    x[0] = 23
    x[1] = 45
    x[2] = 33
    x[3] = 21

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

這邊一樣是宣告五個元素的陣列,x[0] ~ x[4] 的部分是初始化數值的動作,後面 for 迴圈是走訪所有個元素並且加到 total 這個變數中,最後在 Println 的部分再除以 4 計算平均。雖然這個程式沒有問題,但是沒有彈性,如果我今天加入六個元素、七個元素,你就必須要更改三個地方 (宣告、for 迴圈、fmt.Println),所以我們稍微將它更改一下:

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

我們利用內建的函式 len() 來計算陣列的數量,這樣子如果元素有修改,我們就只需要修改一個部分就可以了,剩下的 len() 會自己去計算陣列的數量。但是!!!這個程式執行會有問題,如果你執行程式碼會看到錯誤

invalid operation: total / 4 (mismatched types float64 and int)

這是因為 total 變數和 len() 計算完成後的型態不同,一個是 float64 另一個則是 int,所以發生錯誤,你必須要讓它強制轉型才可以執行。

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

另外 for 迴圈有另外一種內建的寫法可以走訪每個陣列,就是利用 range ,但是他預設會有兩個回傳值,一個是鍵一個是值。

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

這個程式乍看之下沒有問題,但是我們都知道 Go 沒有使用的函式、變數,被 compile 看到連編譯都不給編,會出現「i declared and not used」錯誤,但是這邊我們真的不需要「 i 」這個鍵怎麼辦?我們可以利用「 _ 」這個佔位符來取代。

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

讓我們來稍微檢視一下最後修改的版本

func main() {
    var x [4]float64
    x[0] = 23
    x[1] = 45
    x[2] = 33
    x[3] = 21

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

看起十分的精簡又方便維護!但是就只有這樣了嗎?我個人覺得初始化的部份還是太長了,就讓我們來簡化它!

x := [4]float64{23, 45, 33, 21}

很短對不對!不過它很不方便閱讀,所以你也可以改成:

x := [4]float64{
    23,
    45,
    33,
    21,
}

注意最後一個逗點要留著喔!不然編譯會出錯,你不要覺得這個逗點很奇怪,一切都是有原因的,原因就在於方便維護!!!

x := [3]float64{
    23,
    45,
    33,
    // 21,

}

http://play.golang.org/p/pmN_0o63Hl
有沒有!!!只要註解掉就可以了,超方便的,不用像其他語言再修正什麼逗號了。

comments powered by Disqus