1. 程式人生 > >聊聊Go工作空間

聊聊Go工作空間

前言

對於剛開始學Go的同學,可能會對幾個概念比較迷糊:GOROOT和GOPATH,今天就來聊聊它們。
執行go env,給大家看下我開發環境的相關引數配置(部分):

GOARCH="amd64"
GOBIN="/Users/chengguilu/goProjects/bin"
GOCACHE="/Users/chengguilu/Library/Caches/go-build"
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/chengguilu/goProjects"
GOROOT="/usr/local/go"
GOTOOLDIR=
"/usr/local/go/pkg/tool/darwin_amd64" GCCGO="gccgo" CC="clang" CXX="clang++"

GOROOT

這個比較好理解,GOROOT表示的是go語言編譯、工具、標準庫等的安裝路徑(比如:/usr/local/go),簡而言之,就是安裝路徑,GO安裝好之後就有了。

GOPATH

(畫重點) 可自定義路徑的工作空間-workspace,Go1.7之前必須設定這個變數,且不能夠與Go的安裝目錄相同。1.8之後,GOPATH有預設值–$HOME/go。可以執行go env GOPATH檢視,從上面可以看到,我的GOPATH是/Users/chengguilu/goProjects

。其實,說白了,GOPATH對應計算機的一個目錄。
作用:用來存放Go程式碼,Go的可執行檔案,以及相應的編譯之後的包檔案。
Go程式碼必須放在工作空間內,workspace目錄包含三個子目錄

  • src 存放Go原始碼,它們被組織成包(每個目錄都對應一個包)
  • pkg 存放編譯後生成的檔案,比如:.a檔案(靜態庫檔案)
  • bin 存放編譯後的可執行檔案

我們可以通過go工具構建原始碼包,並將其生成的二進位制檔案安裝到 pkg 和 bin 目錄中。
我們實際操練下,上一節的Hello World入門程式就按照這種方式存放。在workspace建立相關目錄src、pkg和bin,將寫好的hello.go

儲存在GOPATH/src/hello目錄。

建立目錄
現在,我們就可以 go 工具構建並安裝hello.go

go install hello/

我們可以在系統的任一目錄中執行此命令,go 工具會根據指定的GOPATH,在 hello/ 包內查詢原始碼(下一節給大家講包的概念,現在大家瞭解概念就可以,不必深究)。若在包路徑下執行go install,可以省略包路徑。
go install命令產生可執行的二進位制檔案,接著它會將該二進位制檔案安裝到工作空間的 bin 目錄中,例子中為 $GOPATH/bin/hello
go install
通過命令列$GOPATH/bin/hello來執行($GOPATH請自行替換)

還有一種更簡便的方法,直接執行可執行檔案,不過這需要將$GOPATH/bin 新增到 PATH 中。

你的第一個庫

編寫一個庫,並讓hello程式來呼叫它。
$GOPATH/src下建立包目錄github.com/Seekload/stringutil

之後,在該目錄中建立的檔案reverse.go並儲存(檔案看不懂沒關係,隨著學習深入,相關知識點都會講到,這裡只做演示使用):

package stringutil
// Reverse 將其實參字串以符文為單位左右反轉。
func Reverse(s string) string {
	r := []rune(s)
	for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
		r[i], r[j] = r[j], r[i]
	}
	return string(r)
}

目錄如圖:

go build 命令來測試該包的編譯:

go build github.com/Seekload/stringutil

也可以在包目錄下直接執行go build
這個命令不會產生輸出檔案。想要輸出的話,必須使用 go install 命令,它會將編譯之後的靜態檔案放到工作空間的 pkg 目錄中。

確認 stringutil包構建完畢後,修改原來的 hello.go 檔案並使用它:

package main

import (
	"fmt"
	"github.com/Seekload/stringutil"
)

func main() {
	fmt.Println(stringutil.Reverse("!oG ,daolkeeS"))
}

執行go install hello/,重新編譯hello.go,生成可執行檔案hello並執行:

hello.go中,我們引入了github.com/Seekload/stringutil 包,所以重新執行go intall hello/時,stringutil 包會被自動安裝。
注意:go install github.com/Seekload/stringutil 是將 stringutil.a 放到 pkg/darwin_amd64 目錄中,反映出其原始碼目錄。 darwin_amd64 這部分能幫助跨平臺編譯,並反映出你的作業系統和架構。

這一節涉及了包的概念,有些同學可能還不太清楚。別急,將在下節給大家講解Go語言中的包。