前言
在我們接觸一門新的語言的時候祖很,并不著急馬上去學(xué)習(xí)它的語法壮啊,應(yīng)該從一個全局的視角來看看我們接下來要學(xué)的語言時一個什么樣的語言旺拉,值不值得我們?nèi)W(xué)产上,它和我們現(xiàn)有的技術(shù)棧有什么區(qū)別,是否能夠解決技術(shù)痛點蛾狗,以上這幾點是我覺得學(xué)習(xí)之前先要了解的晋涣。
Go 語言目前還是比較新的語言,它是一種自帶并發(fā)沉桌、具有垃圾回收以及快速編譯的靜態(tài)類型語言谢鹊,它結(jié)合了解釋型語言的游刃有余,動態(tài)類型語言的開發(fā)效率留凭,以及靜態(tài)類型的安全性佃扼。同 Java 相比,Go語言有很多不同的地方蔼夜,比如一開始的公有變量和私有變量的規(guī)范松嘶,Go語言中變量大寫就是公有變量,小寫就是私有變量(error除外)挎扰,Go 內(nèi)置了線程和隊列翠订,實現(xiàn)起來比 Java 簡單很多,再比如 Go 的異常處理沒有一大推try/catch遵倦,等等就不一列舉尽超。
Go 語言是 Google 團隊的大佬精心打造出來的,成員之一就有大名鼎鼎的 Unix 操作系統(tǒng)的創(chuàng)造者 Ken Thompson梧躺,C 語言就是他和已經(jīng)過世的李奇一起發(fā)明的似谁。接下來讓我們一起走進 Go 語言的世界吧!
1掠哥、環(huán)境配置
在我們學(xué)習(xí)一門新的語言時巩踏,通常我們會先寫一個 Hello World,Go 語言的 Hello World 如下:
package main
import "fmt"
func main() {
fmt.Println("hello world!")
}
看起來是不是很簡單续搀?我們使用命令
go run main.go
就會得到我們想要的 hello world! 這個時候我已經(jīng)迫不及待的想要自己試試了塞琼,首先我們需要按照 Go 語言的安裝包然后再配置一下 GOPATH 環(huán)境變量,其實這里的 GOPATH 環(huán)境變量也就是你的 workspace禁舷。
1.1 Go 語言安裝
我們根據(jù)自己的機器操作系統(tǒng)選擇相應(yīng)的開發(fā)工具包彪杉,比如你的是Windows 64位的,就選擇windows-amd64的工具包牵咙;是Linux 32位的就選擇linux-386的工具包派近。可以自己查看下自己的操作系統(tǒng)洁桌,然后選擇渴丸,我這邊選擇 Mac 版本的下載就可以了。
Mac 安裝 Go
Mac 下安裝可以直接用 homebrew 或者 官網(wǎng)下載
brew install go
Mac 會默認給你配置好 GOPATH另凌,如果不喜歡可以自己修改谱轨,我的目錄是 /Users/sumin/workspace/dev/golang
,接下來我們配置環(huán)境變量途茫,在終端輸入 vim .bash_profile
碟嘴,然后將一下添加進去后保存退出,并執(zhí)行 source .bash_profile
export GOPATH="/Users/sumin/workspace/dev/golang"
export GOBIN="${GOPATH}/bin"
export PATH="${PATH}:${GOPATH}:${GOPATH}/bin"
然后終端輸入
go version
輸出對應(yīng)的版本號表示安裝成功
go version go1.11.1 darwin/amd64
以上是針對 Mac 的環(huán)境安裝教程囊卜,Linux 和 Mac 都是基于 Unix 娜扇,命令這一塊基本差不多,不過 Linux 更 geek 一些栅组,更偏向于命令行操作雀瓢,比如下載下來的壓縮包需要手動解壓,Linux 中環(huán)境變量的配置和 Mac 稍有不同玉掸,Linux 下又兩個文件可以配置刃麸,其中 /etc/profile 是針對所有用戶都有效的;$HOME/.profile 是針對當(dāng)前用戶有效的司浪,可以根據(jù)自己的情況選擇泊业。
Windows 安裝 Go
首先還是從官網(wǎng)下載相應(yīng)系統(tǒng)的包把沼,解壓到自己選的目錄下,我的是 F:\Go\
吁伺, 然后開始配置環(huán)境變量饮睬,如圖所示
在系統(tǒng)變量中新建 GOROOT,變量值是我們剛剛安裝的路徑篮奄;
修改PATH系統(tǒng)變量捆愁,在變量值最后添加 %GOROOT%\bin
路徑;
最后配置工作目錄 GOPATH,這是我們存放源碼的地方窟却,如圖是我選擇的路徑昼丑,這個隨個人喜好。
同樣終端輸入
go version
輸出對應(yīng)的版本號表示安裝成功
go version go1.11.2 windows/amd64
接下來設(shè)置設(shè)置我們 GOPATH 下的 src 文件夾下新建如下文件夾
├── bin
├── pkg
└── src
- bin 文件夾存放 go install 生成的可執(zhí)行文件夸赫,
當(dāng)我們把 GOPATH/bin 加入到 PATH 后菩帝,我們可以再終端的任意位置直接執(zhí)行 go 文件了
- pkg 文件夾是存在go編譯生成的文件
- src存放的是我們的go源代碼,不同工程項目的代碼以包名區(qū)分
當(dāng)我們在終端輸入 go env
查看編譯環(huán)境:
其中有幾個重要的參數(shù)需要我們注意:
- GOOS :目標(biāo)操作系統(tǒng)憔足,當(dāng)前我的系統(tǒng)是 amd64 位胁附,這個值根據(jù)你的操作系統(tǒng)決定
- GOBIN : 存放可執(zhí)行文件的目錄的絕對路徑
- GOEXE : 當(dāng)前系統(tǒng)可執(zhí)行文件的后綴
- GOPATH : 工作區(qū)目錄的絕對路徑,就是我剛剛設(shè)置的工作路徑
- GOROOT : Go語言的安裝目錄的絕對路徑
1.2 Go 命令
接下來我們看一下 Go 有哪些命令
簡單的過一下滓彰,我們常用的一般也就幾條控妻,如
go build 用于編譯代碼
go run 并運行 Go 程序
go doc 查看 Go 文檔,但是需要安裝相關(guān)插件
go version 查看 Go 當(dāng)前的版本
go clean 移除當(dāng)前源碼包和關(guān)聯(lián)源碼包里面編譯生成的文件
go fmt 格式化 Go 文件揭绑,gofmt -w -l src 可以格式化整個項目
go get 獲取遠程包弓候,該命令內(nèi)部執(zhí)行了兩步,第一步是下載源碼包他匪,第二步是執(zhí)行g(shù)o install
go install 生成可執(zhí)行文件
...
詳細命令可參考官方文檔 Here
2菇存、Go Package
Go 語言同 Java 一樣都是有包的概念,這也是一種模塊化的方式組織代碼邦蜜,在 Go 語言中依鸥,包也是類似的概念,它是把我們的 Go 文件組織起來悼沈,可以方便進行歸類贱迟、復(fù)用等目的。比如 Go 內(nèi)置的 net 包
net
├── http
├── internal
├── mail
├── rpc
├── smtp
├── testdata
├── textproto
└── url
以上是 net 包的一個目錄結(jié)構(gòu)絮供,net 本身是一個包衣吠,net 目錄下的 http 又是一個包。從這個大家可以看到壤靶,Go 語言的包其實就是我們計算機里的目錄缚俏,或者叫文件夾,通過它們進行目錄結(jié)構(gòu)和文件組織,Go 只是對目錄名字做了一個翻譯忧换,叫"包"
而已恬惯。比如這里的 net 包其實就是 net 目錄,http 包其實就是 http 目錄包雀,這也是 Go 語言中的一個命名習(xí)慣宿崭,包名和文件所在的目錄名是一樣的。
2.1 包的命名
首先我們在前面的 Hello World 中聲明了一個 main 包才写,這就和 Java 的 main 函數(shù)一個意思,告訴程序我是入口函數(shù)奖蔓,這里 Go 會把聲明了 main 的包編譯為一個可執(zhí)行程序赞草,并且同一個項目里只有一個入口文件。
Go 語言中的包名一般遵循小寫吆鹤、和所在目錄同名的原則厨疙。當(dāng)我們只有一個項目的時候我們可以直接把文件寫在 src 目錄下,如果我們有多個項目同時存在疑务,我們就要通過包組織我們的代碼了沾凄,官網(wǎng)是推薦使用你個人的 github.com,這一點同 Java 中類似知允。
這里再看下上面的 Hello World 程序
- 首先我們引入了
package main
撒蟀,這里 package 是一個關(guān)鍵字,定義一個包温鸽,和 Java 里的 package 一樣保屯,也是模塊化的關(guān)鍵。 - main 包是一個特殊的包名涤垫,表示程序執(zhí)行的入口姑尺,而不是一個庫。
- import 也是一個關(guān)鍵字蝠猬,表示要引入的包切蟋,和 Java 的 import 關(guān)鍵字一樣,引入后才可以使用它榆芦。
- fmt 是一個包名柄粹,這里表示要引入 fmt 這個包,這樣我們就可以使用它的函數(shù)了歧杏。
- Println 是 fmt 包里的函數(shù)镰惦,和 Java 里的 system.out.println 作用類似,這里注意 Println 是大寫的犬绒,至于為啥呢旺入,我們接下來再說。
2.2 包的導(dǎo)入
要想使用一個包,必須先導(dǎo)入它才可以使用茵瘾,Go 語言提供了 import 關(guān)鍵字來導(dǎo)入一個包礼华,這個關(guān)鍵字告訴 Go 編譯器到磁盤的哪里去找要想導(dǎo)入的包,所以導(dǎo)入的包必須是一個全路徑的包拗秘,也就是包所在的位置圣絮。注意:引用了必須使用,否則會報錯雕旨。
import "fmt"
在我們的 Hello World 中我們打印了一段話扮匠,引入了 fmt
包,如果引入多個我們可以如下使用
import "fmt"
import "github.com/sumin/test" // 遠程包引入
// 推薦下面的寫法
import (
"fmt"
"github.com/sumin/test"
)
2.3 包的別名
在我們開發(fā)過程中有可能會出現(xiàn)重復(fù)的情況(盡量避免)凡涩,這個時候我們可以給其中一個設(shè)置別名使用棒搜,在包的左側(cè)引入,編譯器會自動識別該別名活箕。
package main
import (
"fmt"
su_fmt "github.com/sumin/fmt"
)
func main() {
fmt.Println()
su_fmt.Println()
}
還有上面那個問題力麸,Go 語言規(guī)定導(dǎo)入的包必須引用,這樣確實避免了我們引用很多無用的包增加代碼量育韩,對于維護簡直友好度MAX克蚂!但是有的時候我們需要導(dǎo)入一個包執(zhí)行包里的 init 函數(shù)而不想引用它,這個時候可以使用 Go 內(nèi)置的空白標(biāo)識符 _
筋讨,還是拿上面的代碼舉例
package main
import (
"fmt"
_ "github.com/sumin/fmt"
)
func main() {
fmt.Println()
}
3埃叭、 編輯器
工欲善其事必先利其器,我們使用一個順手的編輯器開發(fā)也會省心不少版仔。不過 Go 不怎么挑剔編輯器游盲,它本身采用的是 UTF-8 的文本文件存放源代碼,所以原則上你可以使用任何文本編輯器蛮粮。
對于我這種新手來說 Jetbrains idea + Go 插件最省心益缎,當(dāng)然也有專門支持 Go 語言的 GoLand 下載地址
同時也推薦使用 vscode,內(nèi)置 Go 全家桶然想,輕便簡潔莺奔,主要是好看关翎,不過需要手動下載 Go 插件继榆。
小結(jié)
第一篇關(guān)于 Go 的準(zhǔn)備工作就到這里吧,大概講了的 Go 開發(fā)安裝配置屈暗、環(huán)境搭建妨蛹、Go 相關(guān)命令屏富,后面還介紹了 Go 的安裝和包管理以及編輯器這一塊,接下來會繼續(xù)學(xué)習(xí) Go 的基礎(chǔ)語法和庫蛙卤,加油~