go 學習筆記之工做空間

搭建好 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,pkgbin 目錄,其中最重要的就是 src 源碼目錄,其他兩個目錄都是派生目錄.git

  • src 目錄是源代碼目錄,是平時寫代碼的地方.
  • pkg 目錄是包對象目錄,裏面的文件大多以 .a 爲後綴名,Go 工具自動處理,暫時不用關心.
  • bin 目錄是可執行命令目錄,是最終產出的文件,例如 Windows 平臺通常會生成 .exe 文件.
若是你剛剛安裝 Go 語言或者不是默認形式安裝的 Go,打開命令行窗口運行 go env 查看 GOPATH 那一項, GOPATH 指代的目錄就是工做空間.
go-base-workspace-go-env.png

體驗別人的 Go 命令

默認狀況下,剛剛安裝完畢的 Go 環境並不會自動建立工做空間目錄,能夠手動建立也能夠運行別人的 Go 命令時順便建立.github

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 命令後,工做空間目前已近乎標準目錄.golang

若是 go get 命令半天沒什麼反應,不要着急,說不定正在下載,只是比較慢而已,若是想要看到下載過程,能夠添加額外參數: go get -u -v

go-base-workspace-go-get-tree.png

能夠看出,go get 命令下載了 hello 命令所依賴的文件並生成 bin/hello.exe 可執行文件,如今終於能夠說一聲 Hello world!vim

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
$ hello
!oG,olleH

這個是啥?怎麼不是傳說中的 Hello World ?windows

go-base-workspace-go-get-angry.png

無論怎麼說,建立工做空間的目的已經達到了,不是嗎?bash

聰明的你,或許已經發現輸出的語句的確不是 Hello World 而是 Hello Go 反過來寫!

打造本身的 Go 命令

若是手頭上沒有 Go 項目或者說想要從零開發 Go 項目的話,那麼只能手動建立工做空間了.app

咱們已經知道了工做空間的規範,可是如今涉及到自定義項目,一樣須要肯定項目的規範.框架

通常說來,項目須要惟一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 可執行文件.

go-base-workspace-go-install-ls.png

如今命令行窗口不負衆望,輸出了期待已久的 Hello World!

go-base-workspace-go-install-hi.png

簡單講解下 Go 命令

不管是下載別人的遠程代碼仍是本身從零編寫代碼,在命令行中都用到了相應命令,go getgo install 等.

  • go get : 下載遠程代碼包,若是本地已安裝,則執行邏輯退化爲 go install.
  • go install : 安裝本地依賴包,若是本地沒有相關依賴,則報錯提示沒法找到相關依賴包.

固然 Go 支持的經常使用命令遠遠不止這兩個,直接輸入 go 天然會提示有哪些命令可供使用,若是想要查詢具體某一個命令的幫助文檔,則輸入 go help <command> 便可,例如 go help get

go-base-workspace-go-help-command.png

這些命令比較簡單,不用翻譯也能猜出八九不離十,故此不浪費時間一一闡述.

下面直接上代碼親測運行一遍相關命令.

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-base-workspace-go-get-surprise.png

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-base-workspace-go-build-question.png

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-base-workspace-go-run-run_away.png

Go 基本環境小結

默認安裝的 Go 省心省力,自動幫咱們設置好相關的環境變量,至於這些變量是幹嗎用的以及怎麼自定義修改,建議初學時不要深究,先搭建好基本的開發環境再說.

go env 命令能夠輸出 Go 的相關配置信息,GOROOTGo 的安裝目錄,GOPATHGo 的工做空間目錄,這是 Go 自己最基本的配置信息.

若是不太瞭解這部份內容,能夠翻看上一篇文章,這裏就不詳細闡述了.

Go 的工做空間下面有 src ,binpkg 三個平行目錄,其中 src 下面纔是咱們真正編寫代碼的目錄.

Go 語言相關的項目既然都放在 src 目錄下就有必定的命名規範,參考 github.com/snowdreams1006/learn-gogithub.com/golang/example 這種形式.

測試 Go 語言的安裝環境以及進行簡單的命令驗證,這些操做自己比較簡單,用不着強大的 IDE ,可是學習 Go 語言若是沒有 IDE 的輔助,那麼很難想象會是什麼樣的局面.

所以,下一節將開始介紹 Go 開發的 IDE 環境配置,感受離工程化開發又邁進一步呢!

go-base-workspace-go-summary-thank_you.png

相關文章
相關標籤/搜索