1. 程式人生 > >Go語言入門——陣列、切片和對映

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

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