1 數(shù)組的定義
定義數(shù)組常規(guī)格式是:var 數(shù)組名 [元素?cái)?shù)量] 元素類型 = {各元素},實(shí)際使用中,可以有很多靈活的操作。如有下面幾種定義數(shù)組的方式:
- 只聲明不賦值
- 使用語法糖
:=以省略var關(guān)鍵字,此時(shí)需要對數(shù)組進(jìn)行賦值 - 使用
...在定義的時(shí)候不指定個(gè)數(shù),由程序通過所賦值的結(jié)果自己計(jì)算。定義時(shí)候需要賦值!
下面是幾種定義方式的實(shí)現(xiàn)案例:
package main
import "fmt"
func main() {
var arr1 [5] int
arr2 := [3]int{1,2,3}
arr3 := [...]int{3,2,32,465,64,3}
// 二維數(shù)組的定義分別代表行列數(shù)
var grid [4][5]int
fmt.Println(arr1,arr2,arr3)
fmt.Println(grid)
}
程序的輸出結(jié)果是:

說明
數(shù)組定義需要在元素類型前面加上[...]或者[數(shù)字],需要注意的是,在使用的時(shí)候,如果方括號中間不帶任何東西,那么他代表的是一個(gè)數(shù)組的切片,就不是指這個(gè)數(shù)組了。所以,需要在定義一個(gè)含有數(shù)組參數(shù)的函數(shù)時(shí),需要帶上方括號內(nèi)的東西。
[10]int和[20]int是不同的類型
2 數(shù)組的遍歷
數(shù)組的遍歷可以采用常規(guī)的for - len的形式,不過建議還是使用Go語言中提供的range方法,該關(guān)鍵字能夠直接獲取到數(shù)組的下標(biāo)和對應(yīng)的元素值。例如:
for i, v := range arr3 {
fmt.Println(i, "->", v)
}
程序?qū)?yīng)的輸出結(jié)果是:

當(dāng)然,可以直接獲取下標(biāo),另外通過
arr3[i]的方式獲取元素。
說明
需要注意的是:數(shù)組也是值傳遞的。在函數(shù)內(nèi)部修改一個(gè)數(shù)組,如果不是從地址層面進(jìn)行了修改。那么脫離了函數(shù)之后,不會(huì)影響老數(shù)組。也就是說,func f(arr [10]int)會(huì)拷貝數(shù)組。
Go語言中一般不直接使用數(shù)組,而是使用切片。下一節(jié)著重介紹切片的概念。
3 切片:slice
所謂切片是指取數(shù)組的一小段數(shù)組元組子集。slice是對數(shù)組的一個(gè)view(視圖)。
首先定義一個(gè)數(shù)組arr:=[...]int{0,1,2,3,4,5,6,7},取一個(gè)切片s:=arr[2:6],s就是一個(gè)切片。s的取值是[2,6),因此,s這個(gè)切片的取值是:[2,3,4,5]
同樣的,可以省略切片的
start或者end,或者 全部省略代表全部數(shù)組元素。
以切片為參數(shù)的時(shí)候,方括號內(nèi)部不用加數(shù)字。
更新某個(gè)數(shù)組的切片,是會(huì)更新數(shù)組內(nèi)容的。
package main
import "fmt"
func printArray(arr []int){
arr[0]=100
for i,v :=range arr{
fmt.Println(i,"->",v)
}
}
func main() {
var arr1 = [5]int {1,2,3,4,5}
slice:=arr1[:]
fmt.Println("更新之前...")
fmt.Println(arr1)
fmt.Println("======================")
printArray(slice)
fmt.Println("更新之后...")
fmt.Println(arr1)
}
上述程序的輸出結(jié)果是:

也就是說,切片作為參數(shù)實(shí)現(xiàn)了數(shù)組指針作為參數(shù)的作用。但是省卻了很多的麻煩寫法。
3.1 Slice的上下限和容量

slice中有三個(gè)概念:指針,長度和容量
參照上圖可知:
- ptr:一個(gè)切片的起始內(nèi)存地址
- len:一個(gè)切片的長度:也就是這個(gè)切片中的當(dāng)前元素個(gè)數(shù)
- cap:一個(gè)切片的擴(kuò)展后的總?cè)萘?/li>
切片是基于數(shù)組的視圖,所以,有一定的可見域。如果切片的下界超過了數(shù)組的最終容量,只會(huì)顯示到數(shù)組的最后元素完成后就結(jié)束。
1. slice可以向后擴(kuò)展,不可以向前擴(kuò)展
- s[i] 不可以超越len(s),向后擴(kuò)展不可以超越底層數(shù)組cap(s)。
3.2 向slice中添加元素
- 添加元素的時(shí)候如果超越cap,系統(tǒng)會(huì)重新分配更大的底層數(shù)組
- 由于值傳遞的關(guān)系,必須接收append的返回值
- s = append(s,val)
一種創(chuàng)建切片的方法: 使用系統(tǒng)內(nèi)置的make方法。
// 創(chuàng)建一個(gè)長度為10的切片,默認(rèn)值都是元素0
s := make([]int, 10)
// 創(chuàng)建一個(gè)長度為10, 容量為32的切片,默認(rèn)值都是元素0
s := make([]int, 10, 32)