搭建好 Go
的基本環境後,現在可以正式開始 Go
語言的學習之旅,初學時建議在預設的 GOPATH
工作空間規範編寫程式碼,基本目錄結構大概是這個樣子.
.
|-- bin
| `-- hello.exe
|-- pkg
| `-- windows_amd64
| `-- github.com
| `-- snowdreams1006
| `-- learn-go
| `-- strings.a
`-- src
`-- github.com
`-- snowdreams1006
`-- learn-go
|-- README.md
|-- hello
| `-- hello.go
`-- strings
|-- reverse.go
`-- reverse_test.go
Go
相關的程式碼儲存在工作空間中,而工作空間目錄預設情況下是 GOPATH
環境變數所指向的目錄(例如: GOPATH=C:\Users\snowdreams006-win7\go
).
工作空間下一般應包括三個一級子目錄,分別是 src
,pkg
和 bin
目錄,其中最重要的就是 src
原始碼目錄,其餘兩個目錄都是派生目錄.
src
目錄是原始碼目錄,是平時寫程式碼的地方.pkg
目錄是包物件目錄,裡面的檔案大多以.a
為字尾名,Go
工具自動處理,暫時不用關心.bin
目錄是可執行命令目錄,是最終產出的檔案,例如Windows
平臺一般會生成.exe
檔案.
如果你剛剛安裝
Go
語言或者不是預設形式安裝的Go
,開啟命令列視窗執行go env
檢視GOPATH
那一項,GOPATH
指代的目錄就是工作空間.
體驗別人的 Go
命令
預設情況下,剛剛安裝完畢的 Go
環境並不會自動建立工作空間目錄,可以手動建立也可以執行別人的 Go
命令時順便建立.
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 /
# 初始時工作空間並未建立
$ ls $GOPATH
ls: cannot access 'C:\Users\snowdreams1006-win7\go': No such file or directory
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 /
# 下載別人的 `Go` 命令順便建立了工作空間
$ go get github.com/snowdreams1006/learn-go/hello
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 /
# 已經按照標準目錄結構建立完畢,目前有src和bin目錄就足夠了
$ ls $GOPATH
bin/ src/
執行完 go get github.com/snowdreams1006/learn-go/hello
命令後,工作空間目前已近乎標準目錄.
如果
go get
命令半天沒什麼反應,不要著急,說不定正在下載,只是比較慢而已,如果想要看到下載過程,可以新增額外引數:go get -u -v
可以看出,go get
命令下載了 hello
命令所依賴的檔案並生成 bin/hello.exe
可執行檔案,現在終於可以說一聲 Hello world!
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
$ hello
!oG,olleH
這個是啥?怎麼不是傳說中的 Hello World
?
不管怎麼說,建立工作空間的目的已經達到了,不是嗎?
聰明的你,或許已經發現輸出的語句的確不是
Hello World
而是Hello Go
反過來寫!
打造自己的 Go
命令
如果手頭上沒有 Go
專案或者說想要從零開發 Go
專案的話,那麼只能手動建立工作空間了.
我們已經知道了工作空間的規範,但是現在涉及到自定義專案,同樣需要確定專案的規範.
一般說來,專案需要唯一id用於區分其他可能出現的同名專案,也就是名稱空間的概念.
作為個人開源專案,同廣大的 Go
專案規範一樣託管到 github.com
網站,因此名稱空間 github.com/user
作為基本路徑.
重要區別:
Go
的名稱空間(即基本路徑)是域名正寫:github.com/snowdreams1006
,如果是其他語言,名稱空間可能就是域名反寫形式:com.github.snowdreams1006
.
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~
# 當前並未建立過工作空間
$ ls $GOPATH
ls: cannot access 'C:\Users\snowdreams1006-win7\go': No such file or directory
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~
# 在工作空間下建立 `learn-go` 專案
$ mkdir -p $GOPATH/src/github.com/snowdreams1006/learn-go/hello
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~
# 在 `learn-go` 專案下建立 `hello.go` 檔案
$ vim $GOPATH/src/github.com/snowdreams1006/learn-go/hello/hello.go
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~
# `hello.go` 檔案內容,輸出 `Hello world`
$ cat $GOPATH/src/github.com/snowdreams1006/learn-go/hello/hello.go
package main
import "fmt"
func main() {
fmt.Printf("Hello, world.\n")
}
現在 Go
語言版的 Hello World
已經編寫完畢,接下來讓我們編輯輸出並安裝 hello
檔案命令吧!
在命令列視窗執行 go install github.com/snowdreams1006/learn-go/hello
命令會在工作空間的 bin
目錄下生成 hello.exe
可執行檔案.
現在命令列視窗不負眾望,輸出了期待已久的 Hello World
!
簡單講解下 Go
命令
無論是下載別人的遠端程式碼還是自己從零編寫程式碼,在命令列中都用到了相應命令,go get
和 go install
等.
go get
: 下載遠端程式碼包,如果本地已安裝,則執行邏輯退化為go install
.go install
: 安裝本地依賴包,如果本地沒有相關依賴,則報錯提示無法找到相關依賴包.
當然 Go
支援的常用命令遠遠不止這兩個,直接輸入 go
自然會提示有哪些命令可供使用,如果想要查詢具體某一個命令的幫助文件,則輸入 go help <command>
即可,例如 go help get
這些命令比較簡單,不用翻譯也能猜出八九不離十,故此不浪費時間一一闡述.
下面直接上程式碼親測執行一遍相關命令.
go get
下載程式碼包
go get github.com/golang/example/hello
下載 Go
官方示例的 hello
程式碼包.
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
$ tree
.
|-- bin
| `-- hello.exe
`-- src
`-- github.com
`-- snowdreams1006
`-- learn-go
`-- hello
`-- hello.go
6 directories, 2 files
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
$ go get github.com/golang/example/hello
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
$ tree
.
|-- bin
| `-- hello.exe
`-- src
`-- github.com
|-- golang
| `-- example
| |-- LICENSE
| |-- README.md
| |-- appengine-hello
| | |-- README.md
| | |-- app.go
| | |-- app.yaml
| | `-- static
| | |-- favicon.ico
| | |-- index.html
| | |-- script.js
| | `-- style.css
| |-- gotypes
| | |-- Makefile
| | |-- README.md
| | |-- defsuses
| | | `-- main.go
| | |-- doc
| | | `-- main.go
| | |-- go-types.md
| | |-- hello
| | | `-- hello.go
| | |-- hugeparam
| | | `-- main.go
| | |-- implements
| | | `-- main.go
| | |-- lookup
| | | `-- lookup.go
| | |-- nilfunc
| | | `-- main.go
| | |-- pkginfo
| | | `-- main.go
| | |-- skeleton
| | | `-- main.go
| | |-- typeandvalue
| | | `-- main.go
| | `-- weave.go
| |-- hello
| | `-- hello.go
| |-- outyet
| | |-- Dockerfile
| | |-- containers.yaml
| | |-- main.go
| | `-- main_test.go
| |-- stringutil
| | |-- reverse.go
| | `-- reverse_test.go
| `-- template
| |-- image.tmpl
| |-- index.tmpl
| `-- main.go
`-- snowdreams1006
`-- learn-go
`-- hello
`-- hello.go
25 directories, 35 files
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
$
原本 $GOPATH/src
原始碼目錄只有我們自己的 github.com/snowdreams1006/learn-go
專案,獲取遠端 golang/hello
程式碼包後多了一大堆原始碼檔案.
真的是神奇的操作,其餘語言呼叫開源工具一般都是作為依賴放到非原始碼目錄,Go
直接放到正在編寫的原始碼目錄,看起來第三方原始碼像是我們自己寫的一樣,只不過用名稱空間區分開了而已!
go test
測試程式碼包
Go
自帶輕量級的測試框架,測試檔案命名是 xxx_test.go
,檔案內的方法簽名是 TestXXX
.
go test github.com/golang/example/stringutil
測試 stringutil
程式碼包,是因為包記憶體在測試檔案 reverse_test.go
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
$ go test github.com/golang/example/stringutil
ok github.com/golang/example/stringutil 0.342s
go install
安裝程式碼包
go install github.com/golang/example/hello
安裝程式碼包,執行可執行檔案 hello
輸出 Hello, Go examples!
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
$ go install github.com/golang/example/hello
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
$ hello
Hello, Go examples!
go build
編譯程式碼包
上述命令我們都是在 golang/example
專案下進行演示的,不能厚此薄彼,下面這兩個命令還是演示我們自己手寫的 hello
命令檔案吧!
首先切換到 hello
目錄下,這樣省的輸入一長串的路徑,在當前目錄下執行 go
命令可以省略檔案路徑.
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
# 切換到 `learn-go` 專案的 `hello` 目錄
$ cd $GOPATH/src/github.com/snowdreams1006/learn-go/hello
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go/src/github.com/snowdreams1006/earn-go/hello
$ ls
hello.go
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go/src/github.com/snowdreams1006/earn-go/hello
# go build 省略檔案路徑表示在當前目錄下進行編譯,輸出檔案也是當前目錄下
$ go build
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go/src/github.com/snowdreams1006/earn-go/hello
$ ls
hello.exe* hello.go
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go/src/github.com/snowdreams1006/earn-go/hello
# 此時直接執行 `hello` 命令,執行的的是 `$GOPATH/bin` 目錄下的命令而不是當前目錄下的 `hello`
$ hello
Hello, Go examples!
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go/src/github.com/snowdreams1006/learn-go/hello
$ ./hello
Hello, world.
上述演示結果,展示了切換到當前目錄下可以直接省略程式碼包路徑,預設輸出的可執行檔案也由原先的 $GOPATH/bin
目錄變成當前目錄.
直接執行 hello
命令輸出的結果是原先的 $GOPATH/bin/hello
命令而不是當前目錄下的 hello
,至於為什麼如此,暫時不太理解.
當然想要執行當前目錄下的 hello.exe
命令檔案也很簡單,指定路徑即可: ./hello
go run
執行程式碼包
go build
命令或者 go install
命令都會生成可執行二進位制檔案,然後執行該二進位制檔案才能輸出命令結果.
go run
就是一步到位的命令,不用生成檔案直接輸出命令的執行結果,有時候這種方式也很有用!
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go/src/github.com/snowdreams1006/learn-go/hello
$ ls
hello.go
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go/src/github.com/snowdreams1006/learn-go/hello
$ go run hello.go
Hello, world.
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go/src/github.com/snowdreams1006/learn-go/hello
$ ls
hello.go
值得注意的是,go run
後面緊跟著的是檔名,不能像 go build
那樣省略包路徑,否則會報錯.
Go
基本環境小結
預設安裝的 Go
省心省力,自動幫我們設定好相關的環境變數,至於這些變數是幹嘛用的以及怎麼自定義修改,建議初學時不要深究,先搭建好基本的開發環境再說.
go env
命令可以輸出 Go
的相關配置資訊,GOROOT
是 Go
的安裝目錄,GOPATH
是 Go
的工作空間目錄,這是 Go
本身最基本的配置資訊.
如果不太瞭解這部分內容,可以翻看上一篇文章,這裡就不詳細闡述了.
Go
的工作空間下面有 src
,bin
和 pkg
三個平行目錄,其中 src
下面才是我們真正編寫程式碼的目錄.
Go
語言相關的專案既然都放在 src
目錄下就有一定的命名規範,參考 github.com/snowdreams1006/learn-go
和 github.com/golang/example
這種形式.
測試 Go
語言的安裝環境以及進行簡單的命令驗證,這些操作本身比較簡單,用不著強大的 IDE
,但是學習 Go
語言如果沒有 IDE
的輔助,那麼很難想象會是什麼樣的局面.
因此,下一節將開始介紹 Go
開發的 IDE
環境配置,感覺離工程化開發又邁進一步呢!