1. 程式人生 > >Go語言的GOPATH與工作目錄詳解

Go語言的GOPATH與工作目錄詳解

GOPATH設定

go 命令依賴一個重要的環境變數:$GOPATH1

(注:這個不是Go安裝目錄。下面以筆者的工作目錄為說明,請替換自己機器上的工作目錄。)

在類似 Unix 環境大概這樣設定:

複製程式碼程式碼如下:
    export GOPATH=/home/apple/mygo

為了方便,應該把新建以上資料夾,並且把以上一行加入到 .bashrc 或者 .zshrc 或者自己的 sh 的配置檔案中。

Windows 設定如下,新建一個環境變數名稱叫做GOPATH:

複製程式碼程式碼如下:
    GOPATH=c:\mygo

GOPATH允許多個目錄,當有多個目錄時,請注意分隔符,多個目錄的時候Windows是分號,Linux系統是冒號,當有多個GOPATH時,預設會將go get的內容放在第一個目錄下

以上 $GOPATH 目錄約定有三個子目錄:

1.src 存放原始碼(比如:.go .c .h .s等)
2.pkg 編譯後生成的檔案(比如:.a)
3.bin 編譯後生成的可執行檔案(為了方便,可以把此目錄加入到 $PATH 變數中,如果有多個gopath,那麼使用${GOPATH//://bin:}/bin新增所有的bin目錄)

以後我所有的例子都是以mygo作為我的gopath目錄

應用目錄結構

建立包和目錄:$GOPATH/src/mymath/sqrt.go(包名:"mymath")

以後自己新建應用或者一個程式碼包都是在src目錄下新建一個資料夾,資料夾名稱一般是程式碼包名稱,當然也允許多級目錄,例如在src下面新建了目錄$GOPATH/src/github.com/astaxie/beedb 那麼這個包路徑就是“github.com/astaxie/beedb”,包名稱是最後一個目錄beedb

執行如下程式碼:

複製程式碼程式碼如下:
cd $GOPATH/src
    mkdir mymath

新建檔案sqrt.go,內容如下:

複製程式碼程式碼如下:
 // $GOPATH/src/mymath/sqrt.go原始碼如下:
    package mymath

    func Sqrt(x float64) float64 {
        z := 0.0
        for i := 0; i < 1000; i++ {
            z -= (z*z - x) / (2 * x)
        }
        return z
    }

這樣我的應用包目錄和程式碼已經新建完畢,注意:一般建議package的名稱和目錄名保持一致

編譯應用

上面我們已經建立了自己的應用包,如何進行編譯安裝呢?有兩種方式可以進行安裝

1、只要進入對應的應用包目錄,然後執行go install,就可以安裝了
2、在任意的目錄執行如下程式碼go install mymath

安裝完之後,我們可以進入如下目錄:

複製程式碼程式碼如下:
 cd $GOPATH/pkg/${GOOS}_${GOARCH}
    //可以看到如下檔案
    mymath.a

這個.a檔案是應用包,那麼我們如何進行呼叫呢?

接下來我們新建一個應用程式來呼叫

新建應用包mathapp:

複製程式碼程式碼如下:
 cd $GOPATH/src
    mkdir mathapp
    cd mathapp
    vim main.go

// $GOPATH/src/mathapp/main.go原始碼:

複製程式碼程式碼如下:
    package main

    import (
          "mymath"
          "fmt"
    )

    func main() {
          fmt.Printf("Hello, world.  Sqrt(2) = %v\n", mymath.Sqrt(2))
    }

如何編譯程式呢?進入該應用目錄,然後執行go build,那麼在該目錄下面會生成一個mathapp的可執行檔案

複製程式碼程式碼如下:
    ./mathapp

輸出如下內容

複製程式碼程式碼如下:
    Hello, world.  Sqrt(2) = 1.414213562373095

如何安裝該應用,進入該目錄執行go install,那麼在$GOPATH/bin/下增加了一個可執行檔案mathapp,這樣可以在命令列輸入如下命令就可以執行

複製程式碼程式碼如下:
mathapp

也是輸出如下內容

複製程式碼程式碼如下:
Hello, world.  Sqrt(2) = 1.414213562373095

獲取遠端包

go語言有一個獲取遠端包的工具就是go get,目前go get支援多數開源社群(例如:github、googlecode、bitbucket、Launchpad)

複製程式碼程式碼如下:
go get github.com/astaxie/beedb

go get -u 引數可以自動更新包,而且當go get的時候會自動獲取該包依賴的其他第三方包
通過這個命令可以獲取相應的原始碼,對應的開源平臺採用不同的原始碼控制工具,例如github採用git、googlecode採用hg,所以要想獲取這些原始碼,必須先安裝相應的原始碼控制工具

通過上面獲取的程式碼在我們本地的原始碼相應的程式碼結構如下:

複製程式碼程式碼如下:
$GOPATH
  src
   |--github.com
          |-astaxie
              |-beedb
   pkg
    |--相應平臺
         |-github.com
               |--astaxie
                    |beedb.a

go get本質上可以理解為首先第一步是通過原始碼工具clone程式碼到src下面,然後執行go install

在程式碼中如何使用遠端包,很簡單的就是和使用本地包一樣,只要在開頭import相應的路徑就可以

複製程式碼程式碼如下:
import "github.com/astaxie/beedb"

程式的整體結構

通過上面建立的我本地的mygo的目錄結構如下所示

複製程式碼程式碼如下:
bin/
    mathapp
pkg/
    平臺名/ 如:darwin_amd64、linux_amd64
         mymath.a
         github.com/
              astaxie/
                   beedb.a
src/
    mathapp
          main.go
      mymath/
          sqrt.go
      github.com/
           astaxie/
                beedb/
                    beedb.go
                    util.go

從上面的結構我們可以很清晰的看到,bin目錄下面存的是編譯之後可執行的檔案,pkg下面存放的是函式包,src下面儲存的是應用原始碼。

[1] Windows系統中環境變數的形式為%GOPATH%,本書主要使用Unix形式,Windows使用者請自行替換。