Go語言中,數組從聲明時就肯定,使用時能夠修改數組成員,可是數組大小不可變化數組
var 數組變量名 [元素數量]T // 定義一個長度爲3元素類型爲int的數組a var a [3]int
數組的長度必須是常量,而且長度是數組類型的一部分。一旦定義,長度不能變。 [3]int
和[5]int
是不一樣的類型指針
數組能夠經過下標進行訪問,下標是從0
開始,最後一個元素下標是:len-1
,訪問越界(下標在合法範圍以外),則觸發訪問越界,會panic。code
初始化數組時能夠使用初始化列表來設置數組元素的值索引
func main() { var Array1 [3]int var Array2 = [3]int{1, 2} var Array3 = [3]string{"北京", "上海", "廣州"} fmt.Println(Array1) fmt.Println(Array2) fmt.Println(Array3) } //[0 0 0] //[1 2 0] //[北京 上海 廣州]
按照上面的方法每次都要確保提供的初始值和數組長度一致,通常狀況下咱們能夠讓編譯器根據初始值的個數自行推斷數組的長度內存
func main() { var Array1 [3]int var Array2 = [...]int{1, 2} var Array3 = [...]string{"北京", "上海", "廣州"} fmt.Println(Array1) fmt.Println(Array2) fmt.Printf("type of Array2: %T\n", Array2) fmt.Println(Array3) fmt.Printf("type of Array3: %T\n", Array3) } //[0 0 0] //[1 2] //type of Array2: [2]int //[北京 上海 廣州] //type of Array3: [3]string
使用指定索引值的方式來初始化數組編譯器
func main() { a := [...]int{1:1, 3:5} fmt.Println(a) fmt.Printf("type of a: %T\n", a) } //[0 1 0 5] //type of a: [4]int
func main() { a := [...]string{"北京", "上海", "廣州"} // 方法一:for循環遍歷 for i := 0; i < len(a); i++ { fmt.Println(a[i]) } // 方法二:for range遍歷 for index, value := range a { fmt.Println(index, value) } } //北京 //上海 //廣州 //0 北京 //1 上海 //2 廣州
func main() { a := [3][2]string{ {"北京", "上海"}, {"廣州", "深圳"}, {"成都", "武漢"}, } for _, value1 := range a { for _, value2 := range value1 { fmt.Printf("%s ", value2) } fmt.Println() } } //北京 上海 //廣州 深圳 //成都 武漢
注意: 多維數組只有第一層能夠使用...
來讓編譯器推導數組長度string
//支持的寫法 a := [...][2]string{ {"北京", "上海"}, {"廣州", "深圳"}, {"成都", "重慶"}, }
數組是值類型,賦值和傳參會複製整個數組。所以改變副本的值,不會改變自己的值for循環
func modifyArray(x [3]int) { x[0] = 666 } func modifyArray2(x [3][2]int) { x[2][0] = 777 } func main() { a := [3]int{1, 2, 3} b := [3][2]int{ {1, 1}, {2, 2}, {3, 3}, } modifyArray(a) //在modifyArray中修改的是a的副本x fmt.Println(a) modifyArray2(b) //在modifyArray2中修改的是b的副本x fmt.Println(b) } //[1 2 3] //[[1 1] [2 2] [3 3]]
注意:編譯
[n]*T
表示指針數組,*[n]T
表示數組指針//指針數組 數組裏面的元素是指針 [5]*int //數組指針 這是一個指針 *[5]int