Go語言的組成分成以下幾個部分:
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 run就可以看到上面源碼的執行結果。
$ go run main.go
Hello, World
其中go run是go tools裡其中之一的命令,作用是將源碼編釋成一個臨時的文件並執行,主要是用來在源碼開發過程測試使用,下面會介紹更多的go tools。
幾乎所有的重要工具都與Go安裝時一起提供,但也有一些工具可以根據你的需要額外安裝,如golint、errcheck等。你可以在命令行裡鍵入go來查看它們:
讓我們從標準的Go tools開始。
Go自帶的管理工具,可以直接從github等站台獲取包。如果需要特定版本的包,可以使用dep進行依賴管理,下載並安裝指定版本的包,如go install。
舉個例子
go get github.com/golang/lint/golint
構建應用程序,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自帶輕量級測試框架testing,go test命令來實現單元測試和性能測試。執行go test後會搜集在執行目錄底下所有名稱為*_test.go的檔案,生成並執行測試用的可執行文件。
輸出結果類似於
ok archive/tar 0.010s
FAIL archive/zip 0.066s
ok compress/gzip 0.023s
...
It lists the packages named by the import paths, one per line.
顯示Go的環境參數
go env
GOARCH="amd64"
GOBIN="/Users/TonyK/go/bin"
go fmt執行後會把代碼依照Go的標準重新格式化,同時也會幫你自動修改import行,不管是你是使用了package的函數卻忘了宣告,或是你import了package卻未曾使用。
IDE裡的自動格式化功能,其實就是在底層調用了go fmt。
go 工具集中提供了一个 go fmt 命令它可以帮你格式化你写好的代码文件,使你写代码的时候不需要关心格式,你只需要在写完之后执行 go fmt <文件名>.go,你的代码就被修改成了标准格式,但是我平常很少用到这个命令,因为开发工具里面一般都带了保存时候自动格式化功能,这个功能其实在底层就是调用了 go fmt。接下来的一节我将讲述两个工具,这两个工具都自带了保存文件时自动化 go fmt 功能。
檢查go的source code並回報可疑的構造,例如調用fmt.Printf時給定的參數錯誤,函數return後還有無用的代碼。
這個命令是從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來重新生成語法的解析器。
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的本地版本,並且可以查詢包的說明文件。