go,

Day4 workspace

Tony Tony Follow Sep 19, 2019 · 2 mins read
Day4 workspace
Share this

Go Hello World

程式組成

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 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的環境參數 ```google cloud 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
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的本地版本,並且可以查詢包的說明文件。

go
Join Newsletter
Get the latest news right in your inbox. We never spam!
Tony
Written by Tony Follow
Hi, I am Tony, the author of Learning Journey blog. I hope you like what I sharing!