Go開發(fā)環(huán)境部署與新手使用指南

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.Errort.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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末躲查,一起剝皮案震驚了整個(gè)濱河市它浅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镣煮,老刑警劉巖姐霍,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異典唇,居然都是意外死亡镊折,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門介衔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恨胚,“玉大人,你說我怎么就攤上這事炎咖≡吲荩” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵乘盼,是天一觀的道長升熊。 經(jīng)常有香客問我,道長绸栅,這世上最難降的妖魔是什么级野? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮阴幌,結(jié)果婚禮上勺阐,老公的妹妹穿的比我還像新娘。我一直安慰自己矛双,他們只是感情好渊抽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著议忽,像睡著了一般懒闷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上栈幸,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天愤估,我揣著相機(jī)與錄音,去河邊找鬼速址。 笑死玩焰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芍锚。 我是一名探鬼主播昔园,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼并炮!你這毒婦竟也來了默刚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤逃魄,失蹤者是張志新(化名)和其女友劉穎荤西,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伍俘,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邪锌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了癌瘾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秃流。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖柳弄,靈堂內(nèi)的尸體忽然破棺而出舶胀,到底是詐尸還是另有隱情,我是刑警寧澤碧注,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布嚣伐,位于F島的核電站,受9級(jí)特大地震影響萍丐,放射性物質(zhì)發(fā)生泄漏轩端。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一逝变、第九天 我趴在偏房一處隱蔽的房頂上張望基茵。 院中可真熱鬧奋构,春花似錦、人聲如沸拱层。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽根灯。三九已至径缅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烙肺,已是汗流浹背纳猪。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桃笙,地道東北人氏堤。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像搏明,于是被迫代替她去往敵國和親丽猬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354