1. Go開發(fā)環(huán)境部署與新手使用指南
1.1. 前言
本篇blog基于Go語言官方文檔給出的安裝指南與代碼編寫指南整理而出森篷,主要參考了以下幾篇文章:
1.2. 開發(fā)環(huán)境部署
1.2.1. 安裝
我準(zhǔn)備在我的Windows 10系統(tǒng)中安裝Go,所以阵赠,首先從Go官網(wǎng)下載Windows版安裝程序
安裝完畢后,編寫個(gè)HelloWorld程序簡單測試一下是否安裝成功侈净,新建文件hello.go
握巢,輸入以下代碼
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
然后唐含,使用go命令編譯該程序
> go build hello.go
執(zhí)行在當(dāng)前目錄下編譯出來的hello.exe程序,執(zhí)行成功則表示Go語言安裝成功
> .\hello.exe
hello, world
1.2.2. Go環(huán)境變量配置
設(shè)置GOPATH
環(huán)境變量秕硝,該變量指向我們平時(shí)編寫Go語言程序的常用工作路徑
> go env -w GOPATH=D:\code\Go
設(shè)置GO111MODULE
環(huán)境變量芥映,打開GoMod功能,再配置七牛云提供的Go代理服務(wù),讓我們更順利地下載Go的庫
> go env -w GO111MODULE=on
> go env -w GOPROXY=https://goproxy.cn,direct
最后奈偏,設(shè)置GOBIN
環(huán)境變量坞嘀,我們使用go install的時(shí)候,會(huì)把編譯出來的可執(zhí)行程序都放到這里來
> go env -w GOBIN=D:\code\Go\bin
1.2.3. 配置VScode的Go語言插件支持
使用VScode打開剛才編寫的hello.go文件惊来,右下角會(huì)自動(dòng)彈出安裝Go相關(guān)插件的彈窗丽涩,點(diǎn)擊Install
即可安裝
Go插件安裝完畢后,再次打開hello.go裁蚁,會(huì)彈窗提示我們安裝go-outline
等插件矢渊,大概有十多個(gè),點(diǎn)擊Install all
來安裝全部
如果沒有配置GOPROXY
環(huán)境變量來設(shè)置Go的代理枉证,這里的插件大概率是無法安裝成功的矮男,由于我們在上一步已經(jīng)設(shè)置了代理,所以這里應(yīng)該會(huì)直接安裝成功
1.3. 新手如何編寫Go語言代碼
在平時(shí)寫代碼時(shí)就考慮到包的組織結(jié)構(gòu)室谚,好像我們總有一天要發(fā)布代碼一樣毡鉴,這是一個(gè)良好的習(xí)慣,Go語言官方文檔也推薦我們這樣做秒赤。接下來就通過簡單的例子來了解一下如何用一種良好的習(xí)慣來寫Go語言代碼
1.3.1. 第一個(gè)程序
要編寫并運(yùn)行一個(gè)簡單的程序猪瞬,首先為模塊選擇一個(gè)路徑(本例中選擇example.com/user/hello
),并創(chuàng)建一個(gè)go.mod
來聲明它
> mkdir hello
> cd hello
> go mod init example.com/user/hello
go: creating new go.mod: module example.com/user/hello
> cat go.mod
module example.com/user/hello
go 1.14
go源文件第一行必須是package name
倒脓,可執(zhí)行程序則必須使用package main
撑螺,同一個(gè)目錄下,只能有一個(gè)main
接下來崎弃,在當(dāng)前目錄中創(chuàng)建一個(gè)名為hello.go
的文件甘晤,文件內(nèi)容如下
package main
import "fmt"
func main() {
fmt.Println("Hello, world.")
}
接下來,我們可以編譯并安裝該go程序了饲做,執(zhí)行以下命令
> go install example.com/user/hello
該命令會(huì)在我們之前設(shè)置的環(huán)境變量GOBIN
指定目錄下线婚,生成二進(jìn)制程序hello.exe
> cd D:\code\Go\bin
> .\hello.exe
Hello, world.
1.3.2. 從我的模塊導(dǎo)入包
接下來,編寫一個(gè)morestrings
包并在hello
程序中使用它盆均。首先塞弊,在hello目錄下新建一個(gè)文件夾morestrings
,以及一個(gè)名為reverse.go
的文件泪姨,文件內(nèi)容如下
// Package morestrings implements additional functions to manipulate UTF-8
// encoded strings, beyond what is provided in the standard "strings" package.
package morestrings
// ReverseRunes returns its argument string reversed rune-wise left to right.
func ReverseRunes(s string) string {
r := []rune(s)
for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
return string(r)
}
reverse.go
文件中游沿,ReverseRunes首字母大寫,表示該函數(shù)被導(dǎo)出肮砾,可以在其它導(dǎo)入了我們的morestrings包的程序中調(diào)用
接下載诀黍,修改hello.go
的代碼,在程序中調(diào)用剛才編寫的包
package main
import (
"fmt"
"example.com/user/hello/morestrings"
)
func main() {
fmt.Println(morestrings.ReverseRunes("Hello, world, reverse me."))
}
安裝hello程序
> go install example.com/user/hello
運(yùn)行該程序仗处,可以看到如下輸出
> .\hello.exe
.em esrever ,dlrow ,olleH
1.3.3. 從遠(yuǎn)程模塊導(dǎo)入包
import
包路徑可以描述如何使用版本控制系統(tǒng)(例如Git或Mercurial)獲取軟件包源代碼眯勾。 go工具使用此屬性來自動(dòng)從遠(yuǎn)程存儲(chǔ)庫獲取軟件包枣宫。這里,我們將要在程序中import github.com/google/go-cmp/cmp
package main
import (
"fmt"
"example.com/user/hello/morestrings"
"github.com/google/go-cmp/cmp"
)
func main() {
fmt.Println(morestrings.ReverseRunes("Hello, world, reverse me."))
fmt.Println(cmp.Diff("Hello World", "Hello Go"))
}
當(dāng)執(zhí)行命令如go install
吃环、go build
也颤、go run
,go會(huì)自動(dòng)下載遠(yuǎn)程模塊郁轻,并在go.mod
中記錄其版本號(hào)
> go install example.com/user/hello
> .\hello.exe
.em esrever ,dlrow ,olleH
string(
- "Hello World",
+ "Hello Go",
)
> cat go.mod
module example.com/user/hello
go 1.14
require github.com/google/go-cmp v0.5.0
1.3.4. 測試
go有一個(gè)由go test
命令和testing
包組成的輕量級(jí)測試框架
可以通過創(chuàng)建一個(gè)已 _test.go
結(jié)尾的測試文件翅娶,測試文件中包含函數(shù)名為 TestXXX
并且參數(shù)包含 func (t *testing.T)
。測試框架會(huì)為每一個(gè)這樣的函數(shù)運(yùn)行測試好唯。如果函數(shù)調(diào)用了失敗函數(shù)如 t.Error
或 t.Fail
故觅,測試會(huì)被認(rèn)定為未通過/失敗
讓我們?yōu)閙orestrings包創(chuàng)建一個(gè)測試,在morestrings目錄下新建測試文件reverse_test.go
渠啊,包含如下代碼
package morestrings
import "testing"
func TestReverseRunes(t *testing.T) {
cases := []struct {
in, want string
}{
{"Hello, world", "dlrow ,olleH"},
{"Hello, 世界", "界世 ,olleH"},
{"", ""},
}
for _, c := range cases {
got := ReverseRunes(c.in)
if got != c.want {
t.Errorf("ReverseRunes(%q) == %q, want %q", c.in, got, c.want)
}
}
}
執(zhí)行以下命令來運(yùn)行自動(dòng)化測試程序
> go test
PASS
ok example.com/user/hello/morestrings 0.167s
1.4. 收工
寫這篇文章的目的是最近在學(xué)習(xí)Go語言输吏,新電腦也需要搭建Go相關(guān)環(huán)境,于是就整理了一下安裝過程中的操作替蛉,以備日后使用贯溅。
同時(shí)也希望這篇文章能夠帶初學(xué)Go語言的朋友些許幫助,Thanks