天天看點

Go語言入門——數組、切片和映射

## 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

Go語言入門——數組、切片和映射
Go語言入門——數組、切片和映射

注意: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的微信公衆号,我會将我的文章推送給您,并和您一起分享我日常閱讀過的優質文章。