golang語言學習 5 陣列

2021-08-18 12:15:30 字數 3651 閱讀 4278

陣列是向來是程式語言中的乙個很重要的資料結構之一。

在golang中陣列是乙個值型別。

先來看看golang中陣列是怎麼定義的

var arr [n]type  //n為陣列長度,type為陣列的儲存型別
再來看一下陣列的宣告方式

常規的宣告方法:

var a [3]int //長度為3,每個元素為乙個整型的陣列

var b [3]*int //指向整型的指標陣列

var c [3][3]int //二維陣列,其中第乙個中括號中數字可省略長度,後乙個中括號中不可省略

//初始化操作

a =

d = ,,}

同樣的,golang中也可以完成宣告的同時完成初始化

a := [3]int       //宣告並初始化乙個長度為3的整型陣列

b := [...]int //省略陣列長度使用...,讓golang根據元素個數來計算長度

c := [3]int //定義乙個長度為3的陣列,對前兩個元素進行賦值,其他元素為0

d := [...]int //定義乙個陣列,將2賦值給該陣列下標為8(第九個)的元素

e := [2][3]int, }

上面完成了陣列的宣告和初始化,下面就來學習一下陣列元素如何進行訪問

通常使用陣列的下標來進行陣列內元素的訪問

golang中有len()方法來對陣列的長度進行計算

通過前面學習的for迴圈,可以達到遍歷陣列元素的目的.

a := [5]int

for b := 0; b 另一種訪問方式為range訪問

a := [5]int

for i, v := range a

輸出結果同上

切片slice

切片的建立

var s1 int  //乍一看和陣列建立沒啥區別,但是切片在中括號中沒有長度的明確數值或者使用...來表示
a := [10]int

s1 := a[9] //下標為9(第十個)元素

s2 := a[5: 9] //取下標5-8的元素 取首不取尾

s3 := a[ : 8] //取下標小於8的元素

s4 := a[3 : ] //起始下標為3之後的元素

s5 := a[ : ] //取陣列裡所有的元素

fmt.println(a)

fmt.println(s1)

fmt.println(s2)

fmt.println(s3)

fmt.println(s4)

fmt.println(s5)

輸出結果:

[1 2 3 4 5 6 7 8 9 10]

10[6 7 8 9]

[1 2 3 4 5 6 7 8]

[4 5 6 7 8 9 10]

[1 2 3 4 5 6 7 8 9 10]

make宣告slice

s1 := make(int, 3, 5)

s2 := make(int, 3)

fmt.println(len(s1), cap(s1))

fmt.println(len(s2), cap(s2))

輸出結果:

3 5  

3 3 //當容量不設定時,預設設定為當前切片長度為最大容量

我們來看乙個slice切片的情況

a := [10]int

s1 := a[2 : 6]

s2 := s1[1 : 5]

fmt.println(a)

fmt.println(s1)

fmt.println(s2)

輸出結果:

[1 2 3 4 5 6 7 8 9 10]

[3 4 5 6]

[4 5 6 7]

為什麼s1中切片只取到3,4,5,6,在s2中能取到s1中為取得的7呢?

我們不妨輸出一下s1的容量cap(s1)得到的是8,也就是說切片s1中取得的容量為[2 : ]的長度,在reslice時,索引被slice的切片為準,同時索引不可以超過被slice的切片容量,如果索引越界,就會引發錯誤

改變slice切片中的值

a := int

s1 := a[1 : 4] //1 2 3

s2 := a[2 : 5] //2 3 4

fmt.println(s1, s2)

s2[0] = 0

fmt.println(s1, s2)

結果輸出

[2 3 4] [3 4 5]

[2 0 4] [0 4 5]

我們發現當改變切片s2中的下標為0的值(對應a陣列中下標為2)時,切片s1下標為1(對應a陣列中下標為2)的值也相對發生了改變,這樣就很好的展現了,slice指向的是乙個底層的陣列,當多個slice指向同乙個底層陣列時,其中乙個slice的值發生改變,另乙個相同陣列下標的元素也發生改變,同樣的,當slice切片因為容量不足,重新建立乙個slice後改變其元素時,共享的對應陣列元素不發生改變,因為擴充套件後的slice切片位址發生了改變.

s1 := make(int, 2, 8)

fmt.printf("%v %p\n", s1)

fmt.printf("%v %p\n", s1, s1)

fmt.printf("%v %p\n", s1, s1)

輸出結果:

[0 0] 0xc04206e040

[0 0 1 2 3 4] 0xc04206e040

[0 0 1 2 3 4 5 6 7 8] 0xc042070080

可以看到,當新增元素在切片容量範圍內,位址不變化,返回原始的slice,當新增元素超過切片容量範圍,拷貝原始的slice到新的位址中,增加容量,在追加元素

copy函式

s1 := int

s2 := int

s3 := int

s4 := int

s5 := int

s6 := int

s7 := int

copy(s1,s5)

fmt.println(s1)

copy(s5,s2)

fmt.println(s5)

copy(s6, s3[0 : 2])

fmt.println(s6)

copy(s4[1 : 2], s7[0 : 1])

fmt.println(s4)

輸出結果:

[5 6 3 4]

[1 2]

[1 2]

[1 5 3 4]

由此可以看到,當短的slice拷貝到長的slice中,slice對應的長度不變,內容拷貝至對應位置,當長的slice拷貝到短的slice中,長度也不變,只拷貝長度內的元素.同樣的,copy支援指定下標拷貝元素

Golang語言學習資源

一 知名的golang開源框架 1.beego 乙個國產的http框架,我們可以用它快速開發各種應用程式。2.gogs 乙個國產的自主git託管服務程式,我們可以用它來搭建自己的git伺服器。3.docker 乙個軟體部署解決方案,也是乙個輕量級的應用容器框架。使用docker,我們可以輕鬆地打包 ...

golang語言學習第七課 陣列

go語言中,定義陣列有3種方法 定義陣列的3種方法 var arr1 5 int 必須在中填入陣列的大小,如果不填則不是陣列,而是切片 arr2 3 int 第二種定義陣列的方法,只能在函式體內用,必須給初始值。arr3 int 第三種,讓編譯器去計算個數的方法。var grid 4 5 int 定...

Golang語言學習筆記(十)

包 package 是多個go原始碼的集合,是一種高階的 復用方案,go語言為我們提供了很多內建包,如fmt,strconv,sort,errors,time,encoding json,os,io等。golang中的包可以分為三種 1.系統內建包 2.自定義包 3.第三方包 系統內建包 golan...