Go語(yǔ)言入門——數(shù)組、切片和Map
按照以往開(kāi)一些專題的風(fēng)格,第一篇一般都是“從HelloWorld開(kāi)始”
但是對(duì)于Go,思來(lái)想去,感覺(jué)真的從“HelloWorld”說(shuō)起,壓根撐不住一篇的篇幅,因?yàn)镚o的HelloWorld太簡(jiǎn)單了。
1、簡(jiǎn)介
Go是什么?
Go(又稱Golang)是Google開(kāi)發(fā)的一種靜態(tài)強(qiáng)類型、編譯型、并發(fā)型,并具有垃圾回收功能的編程語(yǔ)言?!园俣劝倏?/p>
Github地址
官網(wǎng)地址
中文網(wǎng)社區(qū)
如果需要下載安裝包,可以進(jìn)入https://studygolang.com/dl下載,速度較快
關(guān)鍵字
簡(jiǎn)單,學(xué)習(xí)曲線低,天然高并發(fā),背景雄厚,大廠擁抱
2、環(huán)境搭建
下載安裝
進(jìn)入官網(wǎng)或者https://studygolang.com/dl下載對(duì)應(yīng)系統(tǒng)的安裝包(我的是MacOS系統(tǒng))
下載成功后點(diǎn)擊安裝(無(wú)腦下一步即可)
環(huán)境變量配置
打開(kāi)命令行執(zhí)行sudo vi ~/.bash_profile配置GOROOT和GOPATH


注意:GOPATH如果不配置,默認(rèn)在會(huì)在用戶目錄下新建go目錄,GOPATH相當(dāng)于工作空間,有點(diǎn)類似Java開(kāi)發(fā)的workspace。
配置完成執(zhí)行g(shù)o version出現(xiàn)類似
go version go1.12.4 darwin/amd64
則表示安裝成功
開(kāi)發(fā)工具
至于開(kāi)發(fā)工具看個(gè)人喜好,鑒于做Java開(kāi)發(fā)使用的宇宙第一好用IDE intellij idea確實(shí)好用,所以個(gè)人還是繼續(xù)用JetBrain的產(chǎn)品Goland作為開(kāi)發(fā)IDE。
當(dāng)然,除此以外,還有Atom,VS code等等。
下面開(kāi)始進(jìn)入正題,說(shuō)說(shuō)Go語(yǔ)言中的數(shù)組、切片和映射即Map。在此之前還需要介紹幾個(gè)背景知識(shí),不然第一次看Go的語(yǔ)言可能有點(diǎn)懵~
3、背景知識(shí)
類型后置
不同于Java、C++等很多語(yǔ)言,Go采用類型后置的方式聲明變量
比如Java中聲明一個(gè)int的基本類型是這樣的
int a = 3;
而Go里面其中一種聲明方式是這樣的
var a int
a = 3
多樣的賦值語(yǔ)句
Go的聲明和初始化方式豐富多樣,有點(diǎn)太豐富了,聽(tīng)說(shuō)2.0版本要稍微收收規(guī)范下
比如如下的方式是正確的
- 方式1
var a int
a = 3
解讀:初始化語(yǔ)句表明了a是一個(gè)int類型
然后才能對(duì)一個(gè)int類型進(jìn)行賦值
- 方式2
var a = 3
解讀:雖然沒(méi)有明確表示這是一個(gè)int,但是Go可以根據(jù)后面的賦值推斷出a的類型
- 方式3
a := 3
解讀:這是一種簡(jiǎn)單高效的初始化和賦值方式,:=表示初始化一個(gè)變量a并同時(shí)對(duì)其賦值為3
以下方式是不正確的
- 方式1
var a
解讀:基于這樣的信息,a沒(méi)有賦值,Go編譯器是無(wú)法知道a的類型,也無(wú)法對(duì)其進(jìn)行初始化和賦值了
- 方式2
var a int
a := 3
解讀:雖然正確的聲明了一個(gè)int類型的a變量,但是下面的:=相當(dāng)有重新聲明了一個(gè)變量a,所以重復(fù)申明也會(huì)編譯出錯(cuò)
有了上面兩個(gè)背景知識(shí)儲(chǔ)備,加上自個(gè)兒在相關(guān)語(yǔ)言上面深厚的積累,開(kāi)始下面的講解就沒(méi)事問(wèn)題了~
4、數(shù)組
數(shù)組幾乎是每個(gè)語(yǔ)言必備的數(shù)據(jù)結(jié)構(gòu)之一,Go也不例外。
數(shù)組也有多種初始化和賦值方式
- 方式1
var arr [5]int // 注意這里必須要聲明大小,下面要講的切片這里可以不用聲明大小
arr[0] = 0
arr[1] = 1
arr[4] = 4
- 方式2
var arr []int
arr = make([]int, 4)
該方式通過(guò)make指定數(shù)組的大小,這里表示數(shù)組容量為4,超過(guò)4,比如賦值如arr[4]=4,則會(huì)報(bào)錯(cuò)panic: runtime error: index out of range
panic相當(dāng)于Java里面的Exception
- 方式3
var arr [5]int{1,2,3,4,5}
- 方式4
arr := [5]int{1,2,3,4,5}
- 方式5
var arr [...]int{0:1, 3:4, 1:2} // x:y,其中x表示index,y表示值,...表示變長(zhǎng)和Java中的變長(zhǎng)函數(shù)一個(gè)道理
5、切片
切片有些語(yǔ)言里面可能沒(méi)有這個(gè)名詞,我記得Python里面有,Java里就沒(méi)有。
切片可以看成是一種特殊的數(shù)組,該種數(shù)組可以變長(zhǎng)。其生命和初始化方式也有多種
- 方式1
var s []int{1,2,3,4,5}
s := []int{1,2,3,4,5}
- 方式2
s := make([]int, 3, 5) // 3所在位置表示切片長(zhǎng)度,5所在位置表示容量即最大可能存儲(chǔ)的元素個(gè)數(shù)
注意:s[2]=2該賦值是合法的,但是s[3]=3則會(huì)報(bào)錯(cuò),因?yàn)樾枰褂胊ppend追加元素,類似
s = append(s, 3) // 此時(shí)len=4, cap=5
s[3] = 10 // 對(duì)s[3]重新賦值,合法
另外如果賦值時(shí),切片長(zhǎng)度沒(méi)超過(guò)定義的切片的長(zhǎng)度,返回原來(lái)的切片地址,如果超過(guò)了長(zhǎng)度,切片會(huì)擴(kuò)容進(jìn)行重新分配地址。
- 方式3
s := arr[1:3] // 表示截取數(shù)組一部分成為一個(gè)切片,1表示起始位置,3表示結(jié)束為止,是一個(gè)左閉右開(kāi)區(qū)間
6、Map
map就是鍵值對(duì),跟Java的沒(méi)差
聲明好初始化的方式如下
- 方式1
var m map[string]int // string所在位置表示key的類型,int所在位置表示value的類型
- 方式2
m := make(map[string]int, 5) // 5所在位置表示map的容量
- 方式3
m = map[string]int{"jackie":1, "zheng":8}
7、共同點(diǎn)和差異點(diǎn)
數(shù)組、切片和Map都可以通過(guò)make關(guān)鍵字進(jìn)行初始化
數(shù)組、切片和Map都支持在
{}里面使用index:value進(jìn)行初始化值數(shù)組和切片差別在于數(shù)組必須聲明數(shù)組容量,即使是變長(zhǎng)聲明類型,也必須列出具體數(shù)組元素
切片有append函數(shù),涉及到擴(kuò)容等問(wèn)題
8、下篇預(yù)告
1、數(shù)組、切片和map的遍歷以,切片擴(kuò)容,map根據(jù)key和value排序等
2、Go和Java使用體驗(yàn)差異