iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 4
1
Software Development

Golang入門到進階實戰系列 第 4

Day4 源碼組成與Go tools

Go程式組成

程式組成

Go語言的組成分成以下幾個部分:

  • package 聲明
  • import 引用
  • func 函數
  • var 變量
  • 語句 & 表達式
  • 註解
    讓我們再回到上一篇的Hello World代碼,並且加一些組成讓它豐富一點。
package main

import "fmt"

func main(){
    // Go Says "Hello World"
    var s strings
    s = "Hello, World!"
    fmt.Println(s)
}

讓我們來逐步分析上以程序的各個部分
第一行:package main定義了package的名稱,Go程式是通過 package 來組織的,只有package名稱為main的package可以包含main函數,一個可執行程序必須有且僅有一個main包。
下一行:import "fmt",告訴 Go 的編釋器這個程式需要使用 fmt 包的函數(或是其他元素)。
下一行:func main(),func是Go的保留字,功用是宣告一個函數。main函數是程序開始執行的函數,每一個可執行程式裡頭必須包含一個main package和一個main function。
下一行:// ...是註解, Go 編釋器遇到註解會略過不進行編釋,多行註解可以使用用/*...*/
下一行:var s string是宣告變數,此處我們宣告一個變數s,它的資料型態是string。
下一行:s = "Hello World!"是把字串"Hello World!"賦值給變數s。
下一行:fmt.Println(s),其中fmt是我們引入的包,Println是一個fmt包裡頭的函數,在這裡我們呼叫fmt.Println(s)來打印出s變數的字串

執行Go程式

執行go run就可以看到上面源碼的執行結果。

$ go run main.go
Hello, World

其中go run是go tools裡其中之一的命令,作用是將源碼編釋成一個臨時的文件並執行,主要是用來在源碼開發過程測試使用,下面會介紹更多的go tools。

Go tools介紹

幾乎所有的重要工具都與Go安裝時一起提供,但也有一些工具可以根據你的需要額外安裝,如golint、errcheck等。你可以在命令行裡鍵入go來查看它們:

讓我們從標準的Go tools開始。

go get

Go自帶的管理工具,可以直接從github等站台獲取包。如果需要特定版本的包,可以使用dep進行依賴管理,下載並安裝指定版本的包,如go install。

舉個例子

go get github.com/golang/lint/golint

常用參數

  • -u 強制同步到repo最新的版本
  • -d 跳過構建與安裝,單純複製一份repo到你的GOPATH

go build / go install

構建應用程序,go install 和 go build在沒有附加參數的情況下,編釋器會把當前目錄所有後綴為go的檔案(*_test.go除外)進行編釋。
如果編釋的目標是main包, go build會把生成的可執行文件放在當前目錄中, go install 將把它放到 $GOPATH/bin的第一個路徑底下。
此外go install會在$GOPATH/pkg中安裝已編釋的依賴項,要在 go build中達到同樣的效果,請使用 go build -i。

go build命令允許你為任何go支援的目標平台構建可執行文件。這意味你可以在任何地方測試、發布和建置你的應用程序,無需在你希望使用的目標平台上構建那些應用程式。

如果想為編釋後的檔案指定名稱,使用 go build -o tasks。

go test

go自帶輕量級測試框架testing,go test命令來實現單元測試和性能測試。執行go test後會搜集在執行目錄底下所有名稱為*_test.go的檔案,生成並執行測試用的可執行文件。
輸出結果類似於

ok   archive/tar   0.010s
FAIL archive/zip   0.066s
ok   compress/gzip 0.023s
...

常用參數

  • -bench regexp 執行對應的benchmark
  • -cover 顯示測試覆蓋率
  • -run regexp 只測試 regexp 匹配的函數,例如 -run Array會執行包裡Array開頭的函數
  • -v 顯示測試的詳細命令

go list

It lists the packages named by the import paths, one per line.

go env

顯示Go的環境參數

go env
GOARCH="amd64"
GOBIN="/Users/TonyK/go/bin"

go fmt

go fmt執行後會把代碼依照Go的標準重新格式化,同時也會幫你自動修改import行,不管是你是使用了package的函數卻忘了宣告,或是你import了package卻未曾使用。

IDE裡的自動格式化功能,其實就是在底層調用了go fmt。
go 工具集中提供了一个 go fmt 命令它可以帮你格式化你写好的代码文件,使你写代码的时候不需要关心格式,你只需要在写完之后执行 go fmt <文件名>.go,你的代码就被修改成了标准格式,但是我平常很少用到这个命令,因为开发工具里面一般都带了保存时候自动格式化功能,这个功能其实在底层就是调用了 go fmt。接下来的一节我将讲述两个工具,这两个工具都自带了保存文件时自动化 go fmt 功能。

常用參數

  • -w 把修改後的內容直拻寫入到檔案裡
  • -w -l src 將整個項目都格式化

go vet

檢查go的source code並回報可疑的構造,例如調用fmt.Printf時給定的參數錯誤,函數return後還有無用的代碼。

go generate

這個命令是從Go1.4才添加的,主要的功能是完善Go語言的編釋器,我們需要用程式檢查source code或環境,將之編釋成本地配置。例如yacc讀入一個語法描述,並寫出一個程式解析該語法。
但是在Go中,Go的工具從Go源碼獲取所有必要的構建訊息,這產生了一個問題就是沒有機制可以調用外部的構建工具。

go generate的作用就是透過註譯把需要調用工具的命令封裝在go源碼裡,讓我們在構建源碼之前將外部工具構建成Go源碼,並且可以在其後的go build中調用。

譬如,現在有一個名為gopher.y的yacc輸入文件,定義了一種新語言的語萬,我們要先調用yacc工具把它編釋成go源碼(gopher.go)的版本。

go tool yacc -o gopher.go -p parser gopher.y

要使go generate驅動上述命令,我們可以在同一個目錄中任一個.go檔案中添加如下的註釋。

package project

//go:generate go tool yacc -o gopher.go -p parser gopher.y

func Add(x, y int) int {
    return x + y
}

接著回到該目錄下,運行go generate,然後go build、go test等等

$ go generate
$ go build
$ go test

假設沒有錯誤,go generate命令將調用yacc會創建gopher.go的檔案,接著我們可以正常構建、測試。每次gopher.y被修改,我們只需要垂新運行go generate來重新生成語法的解析器。

go doc / godoc

Go1.2版本之前為go doc,之後改成godoc命令,此命令需要額外安裝

go get golang.org/x/tools/cmd/godoc

godoc提供了一個離線的說明文件,查看package文件的指令是godoc ${package},也可以只荳看包裡面特定的函數,用法是多加一個func參數,
在 Go1.2 版本之前还支持 go doc 命令,但是之后全部移到了 godoc 这个命令下,需要这样安装 go get golang.org/x/tools/cmd/godoc

通過terminal在命令行執行godoc -http=:port 比如godoc -http=:8080,然後在瀏覽器中打開localhost:8080,你將會看到golang.org的本地版本,並且可以查詢包的說明文件。


上一篇
Day3 環境建置
下一篇
Day5 數據類型與變數宣告
系列文
Golang入門到進階實戰30

尚未有邦友留言

立即登入留言