搭建好 Go
的基本環境後,如今能夠正式開始 Go
語言的學習之旅,初學時建議在默認的 GOPATH
工做空間規範編寫代碼,基本目錄結構大概是這個樣子.css
. |-- 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
).html
工做空間下通常應包括三個一級子目錄,分別是 src
,pkg
和 bin
目錄,其中最重要的就是 src
源碼目錄,其他兩個目錄都是派生目錄.git
src
目錄是源代碼目錄,是平時寫代碼的地方.pkg
目錄是包對象目錄,裏面的文件大多以 .a
爲後綴名,Go
工具自動處理,暫時不用關心.bin
目錄是可執行命令目錄,是最終產出的文件,例如 Windows
平臺通常會生成 .exe
文件.若是你剛剛安裝
Go
語言或者不是默認形式安裝的Go
,打開命令行窗口運行go env
查看GOPATH
那一項,GOPATH
指代的目錄就是工做空間.
github
Go
命令默認狀況下,剛剛安裝完畢的 Go
環境並不會自動建立工做空間目錄,能夠手動建立也能夠運行別人的 Go
命令時順便建立.golang
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
命令後,工做空間目前已近乎標準目錄.vim
若是
go get
命令半天沒什麼反應,不要着急,說不定正在下載,只是比較慢而已,若是想要看到下載過程,能夠添加額外參數:go get -u -v
windows
能夠看出,go get
命令下載了 hello
命令所依賴的文件並生成 bin/hello.exe
可執行文件,如今終於能夠說一聲 Hello world!
bash
snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go $ hello !oG,olleH
這個是啥?怎麼不是傳說中的 Hello World
?app
無論怎麼說,建立工做空間的目的已經達到了,不是嗎?框架
聰明的你,或許已經發現輸出的語句的確不是
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
環境配置,感受離工程化開發又邁進一步呢!