Go 語言入門二: 如何編寫 Go 代碼

原文鏈接 http://ironxu.com/581

本文是 How to Write Go Code 的學(xué)習(xí)筆記书在。通過示范介紹了Go 語言的開發(fā)過程和 go 工具的使用灼捂。

1. 代碼結(jié)構(gòu)

go 語言特點(diǎn)

  • go 開發(fā)者通常將所有代碼組織在一個(gè)工作空間下
  • 一個(gè)工作空間包含多個(gè)版本控制庫(git)
  • 一個(gè)版本控制庫中包含一個(gè)或多個(gè)應(yīng)用包
  • 一個(gè)包由多個(gè)go 源代碼文件組成

1.1 工作空間

工作空間包含三個(gè)子目錄

  • src 包含所有源代碼文件
  • pkg 包含所有包對象双揪,庫依賴文件等
  • bin 包含所有可執(zhí)行文件

go 工具編譯源碼產(chǎn)生的結(jié)果视事,會存放到 pkg 和 bin 目錄强重。src 目錄一般包含多個(gè)版本控制庫,以追蹤多個(gè)源碼庫的開發(fā).

一個(gè)典型的 go 工作空間如下:

bin/
    hello                          # command executable
    outyet                         # command executable
pkg/
    linux_amd64/
        github.com/golang/example/
            stringutil.a           # package object
src/
    github.com/golang/example/
        .git/                      # Git repository metadata
        hello/
            hello.go               # command source
        outyet/
            main.go                # command source
            main_test.go           # test source
        stringutil/
            reverse.go             # package source
            reverse_test.go        # test source
    golang.org/x/image/
        .git/                      # Git repository metadata
        bmp/
            reader.go              # package source
            writer.go              # package source

示例包含兩個(gè)版本庫(example 和 image)纱意,可執(zhí)行目錄和依賴庫目錄婶溯。

1.2 GOPATH 環(huán)境變量

GOPATH 環(huán)境變量指定 go 工作空間的位置,在開發(fā)go 代碼前指定偷霉。

一般設(shè)置在當(dāng)前用戶目錄下迄委,如下所示:

$ mkdir $HOME/work # 創(chuàng)建工作空間目錄
export GOPATH=$HOME/work # 指定go 工作空間
export PATH=$PATH:$GOPATH/bin # 將可執(zhí)行文件目錄加入環(huán)境變量,方便使用

1.3 導(dǎo)入路徑

導(dǎo)入路徑是一個(gè)包的唯一標(biāo)識类少,指定包所在的位置叙身。

導(dǎo)入標(biāo)準(zhǔn)庫的包時(shí),指定短導(dǎo)入路徑硫狞,例如 "fmt", "net/http" 等

導(dǎo)入自定義包時(shí)信轿,根據(jù) $GOPATH 相對路徑引入

1.4 第一個(gè)程序

go 源碼放在 $GOPATH/src 路徑下赞警。

新建 $GOPATH/src/go_note/src/hello/hello.go 文件,內(nèi)容如下:

// go "hello world" 示例
package main

import "fmt"

func main() {
    fmt.Printf("Hello, world.\n")
}

通過 go install 命令編譯安裝程序:

$ go install go_note/src/hello

go 會找到 $GOPATH/src/go_note/src/hello/ 目錄下的源碼文件虏两,編譯完成將編譯結(jié)果存放在 $GOPATH/bin 目錄下。

執(zhí)行該程序

$ $GOPATH/bin/hello
Hello, world.

1.5 第一個(gè)庫

新建 $GOPATH/src/go_note/src/stringutil/reverse.go 庫文件世剖,內(nèi)容如下:

// Package stringutil contains utility functions for working with strings.
package stringutil

// Reverse returns its argument string reversed rune-wise left to right.
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)
}

使用 go build 命令進(jìn)行編譯檢查

$ go build go_note/src/stringutil

go build 不會輸出任何文件定罢,通過 go install 將包對象放入 pkg 目錄

確認(rèn)包編譯檢查正確后,在 hello.go 文件中使用該包

package main

import (
    "fmt"
    "go_note/src/stringutil"
)

func main() {
    // 輸出字符串
    fmt.Printf("hello, world\n")

    // 反轉(zhuǎn)字符串
    fmt.Printf(stringutil.Reverse("\nhello, world"))
}

重新編譯安裝 hello

$ go install go_note/src/hello

go install 自動(dòng)引入 stringutil

執(zhí)行編譯后的 hello

$ $GOPATH/bin/hello
hello, world
dlrow ,olleh

此時(shí)工作空間結(jié)構(gòu)如下:

bin/
    hello                 # command executable
pkg/
    darwin_amd64/          # this will reflect your OS and architecture
        go_note/src/
            stringutil.a  # package object
src/
    go_note/src/
        hello/
            hello.go      # command source
        stringutil/
            reverse.go    # package source

1.6 包名

go 代碼的第一條語句是包名聲明語句旁瘫。

package name

導(dǎo)入包時(shí)祖凫,通過包名指定需要導(dǎo)入的包

2. 測試

go 通過 go test 命令和測試包組成了一個(gè)輕量測試框架。

創(chuàng)建以 _test.go 結(jié)尾酬凳,函數(shù)名以 TestXXX 形式組成并且包含 func (t *testing.T) 結(jié)構(gòu)的代碼文件惠况,測試框架會逐個(gè)運(yùn)行這些函數(shù),如果函數(shù)拋出 t.Error 或者 t.Fail 異常宁仔,就表示測試不通過稠屠。

新建測試文件 $GOPATH/src/go_note/src/stringutil/reverse_test.go,內(nèi)容如下:

// reverse library 的測試包

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)
        }
    }
}

執(zhí)行測試工具 go test

$ go test go_note/src/stringutil
ok      go_note/src/stringutil  0.006s

3. 遠(yuǎn)程包

導(dǎo)入路徑描述如何從版本控制系統(tǒng)中過去代碼翎苫,go 工具通過這個(gè)屬性权埠,可以獲取遠(yuǎn)程包

go get 獲取 https://github.com/golang/example 代碼,編譯并且安裝相應(yīng)文件

$ go get github.com/golang/example/hello
$ $GOPATH/bin/hello
Hello, Go examples!

參考

@剛剛小碼農(nóng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末煎谍,一起剝皮案震驚了整個(gè)濱河市攘蔽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呐粘,老刑警劉巖满俗,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異作岖,居然都是意外死亡唆垃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門鳍咱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來降盹,“玉大人,你說我怎么就攤上這事谤辜⌒罨担” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵丑念,是天一觀的道長涡戳。 經(jīng)常有香客問我,道長脯倚,這世上最難降的妖魔是什么渔彰? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任嵌屎,我火速辦了婚禮,結(jié)果婚禮上恍涂,老公的妹妹穿的比我還像新娘宝惰。我一直安慰自己,他們只是感情好再沧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布尼夺。 她就那樣靜靜地躺著,像睡著了一般炒瘸。 火紅的嫁衣襯著肌膚如雪淤堵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天顷扩,我揣著相機(jī)與錄音拐邪,去河邊找鬼。 笑死隘截,一個(gè)胖子當(dāng)著我的面吹牛扎阶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播技俐,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乘陪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了雕擂?” 一聲冷哼從身側(cè)響起啡邑,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎井赌,沒想到半個(gè)月后谤逼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仇穗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年流部,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纹坐。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枝冀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出耘子,到底是詐尸還是另有隱情果漾,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布谷誓,位于F島的核電站绒障,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捍歪。R本人自食惡果不足惜户辱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一鸵钝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庐镐,春花似錦恩商、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至末患,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锤窑,已是汗流浹背璧针。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渊啰,地道東北人探橱。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像绘证,于是被迫代替她去往敵國和親隧膏。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容