Go Development Toolbox

這次去北京參加 RubyConfChina 2013 的來回飛機上,寫完了一個練習用的小專案:gosnake,很明顯就是用 Go 寫的貪食蛇。會挑貪食蛇來練習,是因為之前在 iOS Dev Bootcamp 參加 zonble 的 workshop,題目就是寫一個貪食蛇,覺得這個題目拿來練習真的是挺不錯的。

先來看看動起來的樣子:

程式本身很簡單,沒什麼好說的,倒是想紀錄一些開發上使用到的工具。

開發環境

首先我們都知道 Go 有所謂的 GOPATH,src, pkg 等等東西都會安裝在這裡。不過每個專案都有自己的套件相依性,再加上如果東西一直裝,這個目錄會很大一包。所以一般建議會在開發專案時,把 GOPATH 設定到專案目錄底下,以免互相污染。c9s 有寫了一個 script goenv 來簡化這個步驟,我使用的則是我 fork 的版本

使用的方式很簡單,要開發這個專案的時候,切到專案目錄下 source goenv 即可。你的專案目錄下會建立一個 go 目錄,並且 GOPATH 會被指向此處。

套件管理

goenv 其實已經可以解決大部分的問題,如果把 go 目錄也直接 commit 進去的話其實就可以解決 reproducible build 的問題。不過還是希望能有類似 bundler 這樣的工具。

試了兩套 gomgodep。我自己是比較喜歡 gom 的 API 設計,而且他的 star 數也比較多。但是在 gom gen gomfile 自動掃描生成 Gomfile 這邊一直出現問題,會掃到很多不相關的東西。相對的同樣功能的 godep save 就沒什麼問題。並且也支援 godep save -copy 直接把整個 dependencies tree 複製到專案目錄下,讓你用 GOPATH 的方式使用,目前使用起來 godep 是一個挺不錯的選擇。

godep 會把你指定的每個 package 裝到 tmp 目錄下,使用 godep path 就可以看到。

godep 指令包 go 指令的話就會從這些地方載入套件,有點像是 bundler 的感覺。godep go build, godep go test

目前我還是 goenv 和 godeps 並行,看看將來的發展怎麼樣。也希望官方能儘快解決這個問題,不然現在第三方的 Go package management tool 以一個禮拜一套的速度在推出啊…。

更詳細的 godep 教學,可以參考這篇文章: Manage Dependencies With GODEP

測試套件

可能是 Ruby 寫慣了,總覺得 Go 內建的測試語法不太親民。我在這個專案使用了 testifyassert 套件,可以寫出這樣的語法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  // assert equality
  assert.Equal(t, 123, 123, "they should be equal")

  // assert inequality
  assert.NotEqual(t, 123, 456, "they should not be equal")

  // assert for nil (good for errors)
  assert.Nil(t, object)

  // assert for not nil (good when you expect something)
  if assert.NotNil(t, object) {

    // now we know that object isn't nil, we are safe to make
    // further assertions without causing any errors
    assert.Equal(t, "Something", object.Value)

  }

}

testify 除了 assert 之外,也提供了 http, mock, suite 可使用,算是滿全面的測試工具。相類似的套件還有 gocheck 這個也滿受歡迎的。

另外兩個我覺得不錯的測試工具是 Goconvey 以及 PrettyTest

GoConvey 可算一套完整的 BDD/TDD 測試框架,使用了自己的語法,離原生的 testing 又更遙遠了,帶有 WebUI 以及漂亮的 terminal output 可以很清楚產出測試報表。

PrettyTest 則是用自己的 assert 來產出清晰的 terminal output,也可以搭配上面提到的 gocheck 使用。

還有另外非常多的工具可以參考這篇:Go Testing Toolbox

其他工具

go-spew 噴東西相當好用,什麼都可以噴,可以看一下他的 sample output 超威:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(main.Foo) {
 unexportedField: (*main.Bar)(0xf84002e210)({
  flag: (main.Flag) flagTwo,
  data: (uintptr) <nil>
 }),
 ExportedField: (map[interface {}]interface {}) {
  (string) "one": (bool) true
 }
}
([]uint8) {
 00000000  11 12 13 14 15 16 17 18  19 1a 1b 1c 1d 1e 1f 20  |............... |
 00000010  21 22 23 24 25 26 27 28  29 2a 2b 2c 2d 2e 2f 30  |!"#$%&'()*+,-./0|
 00000020  31 32                                             |12|
}

termbox-go 則是寫 CUI 程式的好幫手,非常容易使用。之前那個用 terminal 看股票的 top mop 也是用這個寫的。

Comments