如何正確的開始用 Go 編程

本文會演示簡單的Go軟件包的開發(fā)過程沛贪,并介紹了go命令行工具褒墨,這是我們獲取,構建和安裝Go軟件包和命令的標準方法橘原。

go工具要求你以特定方式組織代碼籍铁。我們會介紹Go安裝啟動和運行的最簡單方法,一定要仔細閱讀啊趾断。

組織代碼結構

概要

Go 程序員一般會將他們的源代碼存放在一個工作區(qū)中(多個項目放在一個工作區(qū))

工作區(qū)中包含許多由 git 管理的代碼倉庫(也可以是其他版本控制工具管理的)

每個代碼倉庫包含一個或者多個 Go package

每個 package 由單一目錄下的一個或多個Go 源碼文件組成

package 的目錄路徑決定了其導入路徑

與其他編程語言不同的是拒名,在其他編程語言里每個項目都有自己的工作區(qū),并且工作區(qū)都與版本控制系統(tǒng)緊密相關歼冰。

工作區(qū)

工作區(qū)是一個目錄層級靡狞,這個目錄層級在頂層有兩個目錄:

src目錄,存放源代碼文件隔嫡。

bin目錄甸怕,存放可執(zhí)行二進制文件。

go命令工具會把src中的Go 文件構建生成二進制文件放在bin目錄中腮恩。

src子目錄通常包含用 git 管理的多個代碼倉庫梢杭,他們對應一個或多個Go 包的開發(fā)源碼。

一個典型的工作區(qū)中會包含多個源碼倉庫秸滴,對應多個可執(zhí)行命令源碼和包源碼武契。大多數(shù) Go 程序員會把他們的Go 源碼和所有依賴的包都放在單一的工作區(qū)中。

下面的例子可以讓你更好的了解Go 的工作區(qū)大概的樣子:

bin/

? ? hello? ? ? ? ? ? ? ? ? ? ? ? ? # 可執(zhí)行命令文件

? ? outyet? ? ? ? ? ? ? ? ? ? ? ? # 可執(zhí)行命令文件

src/

? ? github.com/golang/example/

? ? ? ? ? .git/? ? ? ? ? ? ? ? ? ? ?

? ? ? hello/

? ? ? ? ? hello.go? ? ? ? ? ? ? # 命令文件源碼

? ? ? ? ? outyet/

? ? ? ? ? main.go? ? ? ? ? ? ? ? # 命令文件源碼

? ? ? ? ? main_test.go? ? ? ? ? # 測試文件

? ? ? stringutil/

? ? ? ? ? reverse.go? ? ? ? ? ? # package源碼

? ? ? ? ? ? ? reverse_test.go? ? ? ? # 測試文件

? ? golang.org/x/image/

? ? ? ? .git/? ? ? ? ? ? ?

? ? ? ? bmp/

? ? ? ? ? ? reader.go? ? ? ? ? ? ? # package 源碼

? ? ? ? ? ? writer.go? ? ? ? ? ? ? # package 源碼

? ......

上面的目錄樹展示了工作區(qū)中的兩個代碼倉庫(example 和 image)荡含。example 倉庫中包含兩個命令hello 和 outyet(hello 和 outyet 目錄中存放的就是兩個命令的源碼)一個被用作庫的 package -stirngutil咒唆。image倉庫中包含一個bmp包。

注意:不能使用符號鏈接(軟鏈 ln -s)將文件鏈接到工作區(qū)中释液。

執(zhí)行命令和庫是從不同類的源碼包構建出來的全释,這個之后的部分會進行說明。

GOPATH 環(huán)境變量

GOPATH環(huán)境變量指定工作區(qū)的位置误债。它缺省為用戶目錄中名為go的目錄浸船,因此在Linux上為$HOME/go,在Windows上通常為C:\Users\YourName\Go寝蹈。

如果想在其他位置放置工作區(qū)李命,則需要將GOPATH設置為該目錄的路徑。請注意箫老,GOPATH不得與GO安裝路徑相同封字。

命令go env GOPATH打印當前有效的GOPATH;如果環(huán)境變量未設置,它將打印默認位置周叮。為方便起見辩撑,可以請將工作區(qū)的bin子目錄添加到系統(tǒng)環(huán)境變量$PATH中

$ export PATH=$PATH:$(go env GOPATH)/bin

同時也把GOPATH設置成系統(tǒng)的環(huán)境變量:

$exportGOPATH=$(go env GOPATH)

包的導入路徑

一個***導入路徑***是用來唯一標識包的字符串界斜,包的導入路徑和他在工作區(qū)中的位置相對應仿耽。標準庫中的包具有較短的導入路徑,如“fmt”和“net/http”各薇。對于您自己的軟件包项贺,你必須選擇一個不太可能與將來添加到標準庫或其他外部庫中的內容沖突的基本路徑。

如果你將代碼保存在某個源代碼庫中峭判,那么應該使用該源代碼庫的根目錄作為你的基本路徑开缎。例如,如果你在github.com上有一個GitHub帳戶user林螃,你創(chuàng)建的倉庫都會以 github.com/user 為前綴奕删,那么github.com/user這應該是你的基本路徑。

請注意疗认,在構建代碼之前完残,你不需要將代碼發(fā)布到遠程存儲庫。就像有一天會發(fā)布代碼一樣來組織代碼横漏,這是一個好習慣谨设。實際上,您可以選擇任意路徑名缎浇,只要它是唯一的扎拣。

我們將使用github.com/user作為基本路徑。在工作區(qū)內創(chuàng)建一個保存源代碼的目錄:

$mkdir -p$GOPATH/src/github.com/user

你的第一個Go程序

要編譯并運行一個簡單的程序素跺,首先選擇一個軟件包路徑(我們將使用github.com/user/hello)二蓝,并在您的工作區(qū)內創(chuàng)建一個相應的軟件包目錄:

$mkdir$GOPATH/src/github.com/user/hello

接下來,在該目錄中創(chuàng)建一個名為hello.go的文件指厌,添加以下代碼:

package main

import "fmt"

func main() {

fmt.Println("Hello, world.")

}

現(xiàn)在刊愚,你可以使用go工具構建和安裝該程序了:

$ go install github.com/user/hello

你可以從系統(tǒng)上的任何位置運行此命令。go命令工具通過在GOPATH指定的工作區(qū)內查找github.com/user/hello包來查找源代碼仑乌。如果從軟件包目錄運行go Install百拓,可以省略軟件包路徑:

$cd$GOPATH/src/github.com/user/hello$ go install

go install構建hello命令,生成一個可執(zhí)行的二進制文件晰甚。然后衙传,它將該二進制文件作為hello(在Windows下為hello.exe)安裝到工作區(qū)的bin目錄中,hello 可執(zhí)行命令的位置為$GOPATH/bin/hello厕九。

Go工具僅在發(fā)生錯誤時打印輸出蓖捶,因此如果這些命令沒有產生輸出,則代表它們已成功執(zhí)行扁远。

現(xiàn)在俊鱼,你可以通過在命令行中鍵入程序的完整路徑來運行該程序:

$ $GOPATH/bin/hello

Hello, world.

由于您已將$GOPATH/bin添加到路徑中刻像,因此只需鍵入二進制文件的名字:

$ helloHello, world.

你的第一個 library

讓我們編寫一個庫并在上面寫的hello程序中使用它。

同樣并闲,第一步是選擇軟件包路徑(我們將使用github.com/user/stringutil)并創(chuàng)建軟件包目錄:

$mkdir$GOPATH/src/github.com/user/stringutil

接下來在目錄中創(chuàng)建reverse.go文件并添加如下代碼:

// stringutil包 存放關于字符串的工具函數(shù)

package stringutil

// Reverse 將參數(shù)中的字符串反轉后的字符串

func Reverse(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)

}


現(xiàn)在细睡,使用go build測試軟件包的編譯情況:

$ go build github.com/user/stringutil

go build不會產生輸出文件。相反帝火,它將編譯后的包保存在本地構建緩存中溜徙。

在確認stringutil包構建可以正確之后,修改原始的hello.go(位于$GOPATH/src/github.com/user/hello中)以使用它:

package main

import (

"fmt"

"github.com/user/stringutil"

)

func main() {

fmt.Println(stringutil.Reverse("!oG ,olleH"))

}

再次編譯安裝 hello 程序后運行他犀填,可以看到輸出中的字符串已經被反轉了蠢壹。

$ helloHello, Go!

經過上面幾步后你的工作區(qū)現(xiàn)在應該看起來像下面這樣:

bin/

? ? hello? ? ? ? ? ? ? ?

src/

? ? github.com/user/

? ? ? ? hello/

? ? ? ? ? ? hello.go? ? ?

? ? ? ? stringutil/

? ? ? ? ? ? reverse.go? ?

包名

go 源碼文件中的第一行語句必須是:

packagename

其中,name是用于導入的包的默認名稱九巡。(包中的所有文件必須使用相同的名稱)

go的慣例是包名是導入路徑的最后一個元素:作為“crypto/rot13”導入的包它的包名為rot13图贸。

生成可執(zhí)行命令的源碼文件必須以main作為包名。

go 中不要求鏈接到單個二進制文件的所有包的包名都是唯一的冕广,只要求導入路徑(它們的完整文件名)是唯一的疏日。

測試

go有一個由go測試命令和測試包組成的輕量級測試框架。你可以通過創(chuàng)建一個名字以_test.go結尾的文件來編寫測試佳窑,該文件包含名為TestXXX的函數(shù)制恍,簽名函數(shù)為func(t*testing.T)。測試框架運行每個這樣的函數(shù)神凑;如果函數(shù)調用失敗函數(shù)净神,如t.Error或t.Fail,則認為測試失敗溉委。

通過創(chuàng)建包含以下go代碼的文件$GOPATH/src/github.com/user/stringutil/reverse_test.go鹃唯,將測試添加到strangutil包。

package stringutil

import "testing"

func TestReverse(t *testing.T) {

cases := []struct {

in, want string

}{

{"Hello, world", "dlrow ,olleH"},

{"Hello, 世界", "界世 ,olleH"},

{"", ""},

}

for _, c := range cases {

got := Reverse(c.in)

if got != c.want {

t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want)

}

}

}

然后使用go test運行測試

$ go test github.com/user/stringutil

ok? github.com/user/stringutil 0.165s

導入路徑可以描述如何從版本控制系統(tǒng)(如Git)獲取包源代碼瓣喊。Go工具使用此屬性自動從遠程倉庫中獲取包坡慌。例如,本文檔中描述的示例也保存在GitHub 以github.com/golang/example托管的Git存儲庫中藻三。如果將代碼倉庫的URL包含在軟件包的導入路徑中洪橘,go將會使用go get`自動獲取、構建和安裝它:

$ go get github.com/golang/example/hello

$ $GOPATH/bin/hello

Hello, Go examples!

如果工作區(qū)中沒有指定的包棵帽,go get將把它放在$GOPATH指定的工作區(qū)中熄求。(如果軟件包已經存在,go get將跳過遠程獲取逗概,其行為變得與go install相同弟晚。)。

發(fā)出上述go get命令后,工作區(qū)目錄樹現(xiàn)在應該如下所示:

bin/

? ? hello? ? ? ? ? ? ? ? ? ? ? ? ?

src/

? ? github.com/golang/example/

? ? .git/? ? ? ? ? ? ? ? ? ? ?

? ? ? ? hello/

? ? ? ? ? ? hello.go? ? ? ? ? ? ? ?

? ? ? ? stringutil/

? ? ? ? ? ? reverse.go? ? ? ? ? ? ?

? ? ? ? ? ? reverse_test.go? ? ? ?

? ? github.com/user/

? ? ? ? hello/

? ? ? ? ? ? hello.go? ? ? ? ? ? ? ?

? ? ? ? stringutil/

? ? ? ? ? ? reverse.go? ? ? ? ? ? ?

? ? ? ? ? ? reverse_test.go? ? ? ?

托管在GitHub上的hello命令依賴于同一倉庫中的stringutil包卿城。hello.go文件中的導入使用相同的導入路徑約定枚钓,因此go get命令也能夠定位和安裝依賴包。

import"github.com/golang/example/stringutil"

最后:


上面都是自己整理好的瑟押!我就把資料貢獻出來給有需要的人搀捷!順便求一波關注,哈哈~各位小伙伴關注我后私信【Java】就可以免費領取噠

鏈接:https://juejin.im/post/5e06a300518825125135462a

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末勉耀,一起剝皮案震驚了整個濱河市指煎,隨后出現(xiàn)的幾起案子蹋偏,更是在濱河造成了極大的恐慌便斥,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件威始,死亡現(xiàn)場離奇詭異枢纠,居然都是意外死亡,警方通過查閱死者的電腦和手機黎棠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門晋渺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脓斩,你說我怎么就攤上這事木西。” “怎么了随静?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵八千,是天一觀的道長。 經常有香客問我燎猛,道長恋捆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任重绷,我火速辦了婚禮沸停,結果婚禮上,老公的妹妹穿的比我還像新娘昭卓。我一直安慰自己愤钾,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布候醒。 她就那樣靜靜地躺著能颁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪火焰。 梳的紋絲不亂的頭發(fā)上劲装,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音,去河邊找鬼占业。 笑死绒怨,一個胖子當著我的面吹牛,可吹牛的內容都是我干的谦疾。 我是一名探鬼主播南蹂,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼念恍!你這毒婦竟也來了六剥?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤峰伙,失蹤者是張志新(化名)和其女友劉穎疗疟,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞳氓,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡策彤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了匣摘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片店诗。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖音榜,靈堂內的尸體忽然破棺而出庞瘸,到底是詐尸還是另有隱情,我是刑警寧澤赠叼,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布擦囊,位于F島的核電站,受9級特大地震影響梅割,放射性物質發(fā)生泄漏霜第。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一户辞、第九天 我趴在偏房一處隱蔽的房頂上張望泌类。 院中可真熱鬧,春花似錦底燎、人聲如沸刃榨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枢希。三九已至,卻和暖如春朱沃,著一層夾襖步出監(jiān)牢的瞬間苞轿,已是汗流浹背茅诱。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搬卒,地道東北人瑟俭。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像契邀,于是被迫代替她去往敵國和親摆寄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容

  • How to Write GO Code 中文版 說明官方原文本文按個人理解進行意譯坯门,水平有限微饥,難免有錯或偏差,歡...
    楠小忎閱讀 1,591評論 1 4
  • 預覽 Go程序員通常讓所有的Go代碼在一個單獨的工作空間(workspace). 一個工作空間包含很多版本控制倉庫...
    竹天亮閱讀 473評論 0 1
  • 開始編寫Golang代碼 介紹 本文主要講述如何寫一個簡單的Go包和如何使用golang的工具古戴,如何獲取欠橘、編譯和安...
    uncle_charlie閱讀 1,587評論 0 0
  • 一允瞧、簡介 Go(又稱Golang)是Google開發(fā)的一種靜態(tài)強類型、編譯型畦韭、并發(fā)型,并具有垃圾回收功能的編程語言...
    Mr_Michael閱讀 498評論 0 0
  • 掃地機器人選小米 今天閑來無事稳捆,看上了家里的小米掃地機器人乔夯,便動手把它拆了末荐。和家里那臺罷工的科沃斯對比眶熬,這下對小米...
    陸小昆閱讀 170評論 0 1