陣列是向來是程式語言中的乙個很重要的資料結構之一。
在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...