## Go語言入門——數組、切片和Map
按照以往開一些專題的風格,第一篇一般都是“從HelloWorld開始”
但是對于Go,思來想去,感覺真的從“HelloWorld”說起,壓根撐不住一篇的篇幅,因為Go的HelloWorld太簡單了。
### 1、簡介
> Go是什麼?
**Go**(又稱**Golang**)是[Google](https://baike.baidu.com/item/Google)開發的一種[靜态](https://baike.baidu.com/item/%E9%9D%99%E6%80%81)[強類型](https://baike.baidu.com/item/%E5%BC%BA%E7%B1%BB%E5%9E%8B)、編譯型、并發型,并具有垃圾回收功能的[程式設計語言](https://baike.baidu.com/item/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80)。——摘自百度百科
> Github位址
<https://github.com/golang/go>
> 官網位址
[https://golang.org](https://golang.org/)
> 中文網社群
[https://studygolang.com](https://studygolang.com/)
如果需要下載下傳安裝包,可以進入<https://studygolang.com/dl>下載下傳,速度較快
<https://www.golangtc.com/>
> 關鍵字
簡單,學習曲線低,天然高并發,背景雄厚,大廠擁抱
### 2、環境搭建
#### 下載下傳安裝
進入官網或者<https://studygolang.com/dl>下載下傳對應系統的安裝包(我的是MacOS系統)
下載下傳成功後點選安裝(無腦下一步即可)
#### 環境變量配置
打開指令行執行sudo vi ~/.bash_profile配置GOROOT和GOPATH
注意:GOPATH如果不配置,預設在會在使用者目錄下建立go目錄,GOPATH相當于工作空間,有點類似Java開發的workspace。
配置完成執行go version出現類似
```
go version go1.12.4 darwin/amd64
```
則表示安裝成功
#### 開發工具
至于開發工具看個人喜好,鑒于做Java開發使用的宇宙第一好用IDE intellij idea确實好用,是以個人還是繼續用JetBrain的産品Goland作為開發IDE。
當然,除此以外,還有Atom,VS code等等。
下面開始進入正題,說說Go語言中的數組、切片和映射即Map。在此之前還需要介紹幾個背景知識,不然第一次看Go的語言可能有點懵~
### 背景知識
#### 類型後置
不同于Java、C++等很多語言,Go采用類型後置的方式聲明變量
比如Java中聲明一個int的基本類型是這樣的
```
int a = 3;
```
而Go裡面其中一種聲明方式是這樣的
```
var a int
a = 3
```
#### 多樣的指派語句
Go的聲明和初始化方式豐富多樣,有點太豐富了,聽說2.0版本要稍微收收規範下
比如如下的方式是正确的
* 方式1
```
var a int
a = 3
```
**解讀:**初始化語句表明了a是一個int類型
然後才能對一個int類型進行指派
* 方式2
```
var a = 3
```
**解讀:**雖然沒有明确表示這是一個int,但是Go可以根據後面的指派推斷出a的類型
* 方式3
```
a := 3
```
**解讀:**這是一種簡單高效的初始化和指派方式,`:=`表示初始化一個變量a并同時對其指派為3
**以下方式是不正确的**
* 方式1
```
var a
```
**解讀:**基于這樣的資訊,a沒有指派,Go編譯器是無法知道a的類型,也無法對其進行初始化和指派了
* 方式2
```
var a int
a := 3
```
**解讀:**雖然正确的聲明了一個int類型的a變量,但是下面的`:=`相當有重新聲明了一個變量a,是以重複申明也會編譯出錯
有了上面兩個背景知識儲備,加上自個兒在相關語言上面深厚的積累,開始下面的講解就沒事問題了~
### 數組
數組幾乎是每個語言必備的資料結構之一,Go也不例外。
數組也有多種初始化和指派方式
* 方式1
```
var arr [5]int // 注意這裡必須要聲明大小,下面要講的切片這裡可以不用聲明大小
arr[0] = 0
arr[1] = 1
arr[4] = 4
```
* 方式2
```
var arr []int
arr = make([]int, 4)
```
該方式通過make指定數組的大小,這裡表示數組容量為4,超過4,比如指派如`arr[4]=4`,則會報錯`panic: runtime error: index out of range`
panic相當于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表示值,...表示變長和Java中的變長函數一個道理
```
### 切片
切片有些語言裡面可能沒有這個名詞,我記得Python裡面有,Java裡就沒有。
切片可以看成是一種特殊的數組,該種數組可以變長。其生命和初始化方式也有多種
* 方式1
```
var s []int{1,2,3,4,5}
s := []int{1,2,3,4,5}
```
* 方式2
```
s := make([]int, 3, 5) // 3所在位置表示切片長度,5所在位置表示容量即最大可能存儲的元素個數
```
**注意:**`s[2]=2`該指派是合法的,但是`s[3]=3`則會報錯,因為需要使用append追加元素,類似
```
s = append(s, 3) // 此時len=4, cap=5
s[3] = 10 // 對s[3]重新指派,合法
```
另外如果指派時,切片長度沒超過定義的切片的長度,傳回原來的切片位址,如果超過了長度,切片會擴容進行重新配置設定位址。
* 方式3
```
s := arr[1:3] // 表示截取數組一部分成為一個切片,1表示起始位置,3表示結束為止,是一個左閉右開區間
```
### Map
map就是鍵值對,跟Java的沒差
聲明好初始化的方式如下
* 方式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}
```
### 共同點和差異點
* 數組、切片和Map都可以通過make關鍵字進行初始化
* 數組、切片和Map都支援在`{}`裡面使用`index:value`進行初始化值
* 數組和切片差别在于數組必須聲明數組容量,即使是變長聲明類型,也必須列出具體數組元素
* 切片有append函數,涉及到擴容等問題
### 下篇預告
1、數組、切片和map的周遊以,切片擴容,map根據key和value排序等
2、Go和Java使用體驗差異
如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”将是我最大的寫作動力!如果您想持續關注我的文章,請掃描二維碼,關注JackieZheng的微信公衆号,我會将我的文章推送給您,并和您一起分享我日常閱讀過的優質文章。