「Go」數組

不積跬步,無以至千里;不積小流,無以成江海。

Array(數組)

數組是 同一種 數據類型元素的集合。 在Go語言中,數組從聲明時就確定,使用時可以修改數組成員,但是數組大小不可變化。 基本語法:

<code>
// 定義一個長度為3元素類型為int的數組a

var a [3]int

/<code>
數組定義

var 數組變量名 [元素數量]T

比如:var a [5]int, 數組的 長度必須是常量,並且長度是數組類型的一部分。一旦定義,長度不能變。 [3]int 和 [4]int 雖然都是數組,但他們卻是不同的類型,使用 fmt 的 %T 可以查得,如果使用 == 來比較,返回false

<code>
import (

"fmt"

)

func main() {

var a [3]int

var b [4]int

fmt.Println(a == b) //不可以這樣做,因為此時a和b是不同的類型

}

/<code>

數組可以通過 下標 進行訪問,下標是從0開始,最後一個元素下標是:len-1,訪問越界(下標在合法範圍之外),則觸發訪問越界,會 panic。

數組初始化
方法一

初始化數組時可以使用初始化列表來設置數組元素的值。

<code>
func main() {

var testArray [3]int //數組會初始化為int類型的零值

var numArray = [3]int{1, 2} //使用指定的初始值完成初始化

var cityArray = [3]string{"北京", "上海", "深圳"} //使用指定的初始值完成初始化

fmt.Println(testArray) //[0 0 0]

fmt.Println(numArray) //[1 2 0]

fmt.Println(cityArray) //[北京 上海 深圳]

}

/<code> 

是不是覺得每次寫 [3]int 有點麻煩,你可以為 [3]int 定義一個類型字面量,也就是別名類型。

使用 type 關鍵字可以定義一個類型字面量,後面只要你想定義一個容器大小為3,元素類型為int的數組 ,都可以使用這個別名類型。

<code>
import (

"fmt"

)

func main() {

type arr3 [3]int

myarr := arr3{1,2,3}

fmt.Printf("%d 的類型是: %T", myarr, myarr)

}

/<code>

輸出

<code>
[1 2 3] 的類型是: main.arr3

/<code>
方法二

上面的 3 表示數組的元素個數 ,萬一你哪天想往該數組中增加元素,你得對應修改這個數字,為了避免這種硬編碼,你可以這樣寫,使用 ... 讓編譯器根據初始值的個數自行推斷數組的長度

<code>
func main() {

var testArray [3]int

var numArray = [...]int{1, 2}

var cityArray = [...]string{"北京", "上海", "深圳"}

fmt.Println(testArray) //[0 0 0]

fmt.Println(numArray) //[1 2]

fmt.Printf("type of numArray:%T\n", numArray) //type of numArray:[2]int

fmt.Println(cityArray) //[北京 上海 深圳]

fmt.Printf("type of cityArray:%T\n", cityArray) //type of cityArray:[3]string

}

/<code>
方法三

我們還可以使用指定索引值的方式來初始化數組

<code>
func main() {

a := [...]int{1: 1, 3: 5}

fmt.Println(a) // [0 1 0 5]

fmt.Printf("type of a:%T\n", a) //type of a:[4]int

}

/<code>
數組的遍歷
<code>
func main() {

var a = [...]string{"北京", "上海", "深圳"}

// 方法1:for循環遍歷

for i := 0; i < len(a); i++ {

fmt.Println(a[i])

}

// 方法2:for range遍歷

for index, value := range a {

fmt.Println(index, value)

}

}

/<code> 
多維數組
二維數組定義
<code>
func main() {

a := [3][2]string{

{"北京", "上海"},

{"廣州", "深圳"},

{"成都", "重慶"},

}

fmt.Println(a) //[[北京 上海] [廣州 深圳] [成都 重慶]]

fmt.Println(a[2][1]) //支持索引取值:重慶

}

/<code>
二維數組的遍歷
<code>
func main() {

a := [3][2]string{

{"北京", "上海"},

{"廣州", "深圳"},

{"成都", "重慶"},

}

for _, v1 := range a {

for _, v2 := range v1 {

fmt.Printf("%s\t", v2)

}

fmt.Println()

}

}

/<code>

輸出:

<code>
北京 上海

廣州 深圳

成都 重慶

/<code>

注意: 多維數組只有第一層可以使用...來讓編譯器推導數組長度。例如:

<code>
//支持的寫法

a := [...][2]string{

{"北京", "上海"},

{"廣州", "深圳"},

{"成都", "重慶"},

}

//不支持多維數組的內層使用...

b := [3][...]string{

{"北京", "上海"},

{"廣州", "深圳"},

{"成都", "重慶"},

}

/<code>
數組是值類型

數組是值類型,賦值和傳參會複製整個數組。因此改變副本的值,不會改變本身的值。

<code>
func modifyArray(x [3]int) {

x[0] = 100

}

func modifyArray2(x [3][2]int) {

x[2][0] = 100

}

func main() {

a := [3]int{10, 20, 30}

modifyArray(a) //在modify中修改的是a的副本x

fmt.Println(a) //[10 20 30]

b := [3][2]int{

{1, 1},

{1, 1},

{1, 1},

}

modifyArray2(b) //在modify中修改的是b的副本x

fmt.Println(b) //[[1 1] [1 1] [1 1]]

}

/<code>
點關注 不迷路

如果你從本篇內容有收穫,求

點贊,求 關注,求 轉發 ,讓更多的人學習到。

如果本文有任何錯誤,請批評指教,不勝感激


分享到:


相關文章: