Go語(yǔ)言入門——數(shù)組、切片和映射

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地址

https://github.com/golang/go

官網(wǎng)地址

https://golang.org

中文網(wǎng)社區(qū)

https://studygolang.com

如果需要下載安裝包,可以進(jìn)入https://studygolang.com/dl下載,速度較快

https://www.golangtc.com/

關(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

0518-1-配置環(huán)境變量.png
0518-2-配置環(huán)境變量2.png

注意: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)差異

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容