Monday, February 1, 2016

Golang的環境設定與檔案結構

go_file

Golang的工作目錄

一直以來我都是用簡單的方式寫Go語言。在任何一個目錄下。 利用

 go run a.go
 or 
 go run *.go

的方式,並沒有太在意檔案結構的問題。 由於在sublime的環境下,檔案結構的問題就出現了。所以特別研究一下,將這一部分標準化。

GO環境設定

在.bashrc下的重要環境參數

export GOROOT=/usr/local/go
export GOPATH=$HOME/golang/projects/routetest
export GOARCH=amd64
export GOOS=linux
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOROOT/bin

其中$GOPATH$GOBIN在這次討論中是最重要的兩個參數。

檔案結構

一般說來我們會在$GOPATH下建立以下目錄

這三個目錄的學問實在太大了,必須要好好說明一下。 首先 工作目錄是在src下,最好的方式是在此目錄下建立一個 github.com/專案名/子專案目錄如下

而我的工作區域就在github.com/jonah下,先列出我目前的工作目錄下的檔案

golang中我們會有package main這樣的標示方式,而在route目錄下即為我們package main的工作區域,換句話說,在此目錄下都可以宣告為package main

hhandle是我特別做的一個lib區域,亦即package hhandle的區域。

任何lib可在jonah下的工作區域創建。其package名稱可任意,但最好是跟目錄相關。 這樣做的好處是,我們可以在route.go下import自己創建的lib,如下

import (
        "fmt"
        "github.com/jonah/hhandle"
)

這樣的做法是官網推薦的方式。

https://golang.org/doc/code.html

我們來看看這樣做到底有什麼好處。 當我們需要第三方Lib的時候我們會用下列的語法獲得

go get github/gorilla/mux

此時mux的source code會安裝在src/github.com/gorilla目錄下,而.a檔會被放置在pkg目錄下,如下結果

基本上我們自己的工作目錄,與第三方的工作目錄是處在同一個檔案位階下,其實,這樣的想法的確大大的簡化了工作目錄應該在哪裡的問題。 因此我們的import可能會變成以下這樣

import (
        "fmt"
        "github.com/jonah/hhandle"
        "github.com/gorilla/mux"
)

我們自己寫的lib與第三方的lib的import方法是完全一樣的。其實這麼做是有一種簡潔的美感,與對稱性。

如何做出.a檔與執行檔

當我們從第三方下載的lib我們除了獲得source檔外,我們還獲得.a檔並會自動安裝於pkg/linux_amd64/github.com下,當然這需要GO環境設定符合我們之前的設定。 我們在我們創建的lib下hhandle目錄下執行

go build
go install

你會發現pkg/linux_amd64/github.com下會多出jonah/hhandle.a的檔案。

注意這是lib目錄,亦即我們宣告的package 不為main。 我們來看看如果我們在main目錄下執行上述指令會發生什麼事情

/bin目錄下產生了一個執行檔route。當我們在main下執行go build時,會產生執行檔routesrc下的route目錄。而當執行go install時會將route執行檔搬移到bin目錄下。 當然這是因為我們的環境設定,是做如下的設定

export GOBIN=$GOPATH/bin

很妙的,當我們在我們自創的lib下(import hhandle),我們執行go buildgo install得到的結果是跟在main下(package main)是完全不同的。 這也就是說為什麼我一開始說,這部分的學問實在很大的原因。GO環境變數的搭配,與工作目錄,與go的相關指令,有著很大的關聯性。

No comments:

Post a Comment