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

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

按照以往開一些專題的風格,第一篇通常都是「從HelloWorld開始」git

可是對於Go,思來想去,感受真的從「HelloWorld」提及,壓根撐不住一篇的篇幅,由於Go的HelloWorld太簡單了。github

一、簡介

Go是什麼?golang

Go(又稱Golang)是Google開發的一種靜態強類型、編譯型、併發型,並具備垃圾回收功能的編程語言。——摘自百度百科編程

Github地址數組

github.com/golang/gobash

官網地址數據結構

golang.org併發

中文網社區app

studygolang.com編程語言

若是須要下載安裝包,能夠進入studygolang.com/dl下載,速度較快

www.golangtc.com/

關鍵字

簡單,學習曲線低,自然高併發,背景雄厚,大廠擁抱

二、環境搭建

下載安裝

進入官網或者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 [5]int{1,2,3,4,5}
複製代碼
  • 方式3
arr := [5]int{1,2,3,4,5}
複製代碼
  • 方式4
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函數,涉及到擴容等問題

八、下篇預告

一、數組、切片和map的遍歷以,切片擴容,map根據key和value排序等

二、Go和Java使用體驗差別

我的公衆號:JackieZheng 我會將我最新的文章推送給您,並和您一塊兒分享我平常閱讀過的優質文章

相關文章
相關標籤/搜索