訪問數組元素:
數組中的每個元素都可以通過“[]”和一個從0開始的索引進行訪問
數組的長度可由內置函數len來確定。在聲明數組時,未被賦值元素的值是對應類型的零值。下面看一個例子
package mainfunc main(){var planets [8]stringplanets[0] = "Mercury"planets[1] = "Venus"planets[2] = "Earth"earth := planets[2]fmt.Println(earth)fmt.Println(len(planets))fmt.Println(planets[3] = "")
}
結果自行編譯運行查看哈。
數組越界:
Go編譯器在檢測到對越界元素的訪問時會報錯。如果Go編譯器在編譯時未能發現越界錯誤,那么程序在運行時會出現panic,而Panic會導致程序崩潰。
var planets [8]stringi := 8planets[i] = "Pluto"pluto := planets[i]fmt.Println(pluto) //以上程序報錯,數組越界。[8]指數組的內存為8,從0開始數
使用復合字面值初始化數組:
復合字面值(composite literal)是一種給復合類型初始化的緊湊語法。Go的復合字面值允許我們只用一步就完成數組聲明和數組初始化兩步操作:
dwarfs := [5]string{"Ceres", "Pluto", "Haumea", "Makemake", "Eris"}
可以在復合字面值里使用“...”作為數組的長度,這樣,Go編譯器會自動計算出數組的元素數量
無論哪種方式,數組的長度都是固定的。
//復合字面值初始化數組planets1 := [...]string{"Mercury","Venus","Earth","Mars","Jupiter","Saturn","Pluto", //數組的最后一個參數后要補逗號
下面來看兩個遍歷數組的例子:
//遍歷數組,法一:dwarfs := [5]string{"Ceres", "Pluto", "Haumea", "Makemake", "Eris"}for i := 0; i < len(dwarfs); i++ {dwarf := dwarfs[i] //此處的dwarf和下方的dwarf同時定義但不報錯,是閉包現象:此處的dwarf被封閉在了for循環函數內。fmt.Println(i+1, dwarf) //人性化設計}//法二:for i, dwarf := range dwarfs {fmt.Println(i, dwarf)}
數組的復制:
無論數組賦值給新的變量還是將它傳遞給函數,都會產生一個完整的數組副本。
planets := [...]string{"Mercury","Venus","Earth","Mars","Jupiter","Saturn","Pluto", //數組的最后一個參數后要補逗號}planetsMarkII := planets //數組復制planets[2] = "whoops"fmt.Println(planets)fmt.Println(planetsMarkII)
數組也是一種值,函數通過值傳遞來接受參數。所以數組作為函數的參數就非常的低效。
func terraform(planets [7]string) {for i := range planets {planets[i] = "New" + planets[i]}
}func main(){planets := [...]string{"Mercury","Venus","Earth","Mars","Jupiter","Saturn","Pluto", //數組的最后一個參數后要補逗號}planets[6] = "rock"terraform(planets)fmt.Println(planets)
}
數組的長度也是數組類型的一部分(嘗試將長度不符的數組作為參數傳遞,將會報錯)
函數一般使用slice(切片)而不是數組作為參數,這個內容下一節會講到。
再來看一個二維數組的例子
var board [8][8]stringboard[0][0] = "r"board[0][7] = "r"for column := range board[1] { //把二維數組board的第二行全部替換為Pboard[1][column] = "p"}fmt.Print(board)