前面我們在安裝Go的時候看到需要設置GOPATH變量,Go從1.1版本開始必須設置這個變量,而且不能和Go的安裝目錄一樣,這個目錄用來存放Go源碼,Go的可運行文件,以及相應的編譯之后的包文件。所以這個目錄下面有三個子目錄:src、bin、pkg
## [](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.2.md#gopath設置)GOPATH設置
go 命令依賴一個重要的環境變量:$GOPATH
Windows系統中環境變量的形式為`%GOPATH%`,本書主要使用Unix形式,Windows用戶請自行替換。
_(注:這個不是Go安裝目錄。下面以筆者的工作目錄為示例,如果你想不一樣請把GOPATH替換成你的工作目錄。)_
在類似 Unix 環境大概這樣設置:
~~~
export GOPATH=/home/apple/mygo
~~~
為了方便,應該把新建以上文件夾,并且把以上一行加入到?`.bashrc`?或者?`.zshrc`?或者自己的?`sh`?的配置文件中。
Windows 設置如下,新建一個環境變量名稱叫做GOPATH:
~~~
GOPATH=c:\mygo
~~~
GOPATH允許多個目錄,當有多個目錄時,請注意分隔符,多個目錄的時候Windows是分號,Linux系統是冒號,當有多個GOPATH時,默認會將go get的內容放在第一個目錄下。
以上 $GOPATH 目錄約定有三個子目錄:
* src 存放源代碼(比如:.go .c .h .s等)
* pkg 編譯后生成的文件(比如:.a)
* bin 編譯后生成的可執行文件(為了方便,可以把此目錄加入到 $PATH 變量中,如果有多個gopath,那么使用`${GOPATH//://bin:}/bin`添加所有的bin目錄)
以后我所有的例子都是以mygo作為我的gopath目錄
## [](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.2.md#代碼目錄結構規劃)代碼目錄結構規劃
GOPATH下的src目錄就是接下來開發程序的主要目錄,所有的源碼都是放在這個目錄下面,那么一般我們的做法就是一個目錄一個項目,例如: $GOPATH/src/mymath 表示mymath這個應用包或者可執行應用,這個根據package是main還是其他來決定,main的話就是可執行應用,其他的話就是應用包,這個會在后續詳細介紹package。
所以當新建應用或者一個代碼包時都是在src目錄下新建一個文件夾,文件夾名稱一般是代碼包名稱,當然也允許多級目錄,例如在src下面新建了目錄$GOPATH/src/github.com/astaxie/beedb 那么這個包路徑就是"github.com/astaxie/beedb",包名稱是最后一個目錄beedb
下面我就以mymath為例來講述如何編寫應用包,執行如下代碼
~~~
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的名稱和目錄名保持一致
## [](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.2.md#編譯應用)編譯應用
上面我們已經建立了自己的應用包,如何進行編譯安裝呢?有兩種方式可以進行安裝
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))
}
~~~
可以看到這個的package是`main`,import里面調用的包是`mymath`,這個就是相對于`$GOPATH/src`的路徑,如果是多級目錄,就在import里面引入多級目錄,如果你有多個GOPATH,也是一樣,Go會自動在多個`$GOPATH/src`中尋找。
如何編譯程序呢?進入該應用目錄,然后執行`go build`,那么在該目錄下面會生成一個mathapp的可執行文件
~~~
./mathapp
~~~
輸出如下內容
~~~
Hello, world. Sqrt(2) = 1.414213562373095
~~~
如何安裝該應用,進入該目錄執行`go install`,那么在$GOPATH/bin/下增加了一個可執行文件mathapp, 還記得前面我們把`$GOPATH/bin`加到我們的PATH里面了,這樣可以在命令行輸入如下命令就可以執行
~~~
mathapp
~~~
也是輸出如下內容
~~~
Hello, world. Sqrt(2) = 1.414213562373095
~~~
這里我們展示如何編譯和安裝一個可運行的應用,以及如何設計我們的目錄結構。
## [](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.2.md#獲取遠程包)獲取遠程包
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"
~~~
## [](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.2.md#程序的整體結構)程序的整體結構
通過上面建立的我本地的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下面保存的是應用源代碼
- 第一章 Go環境配置
- 1.1 Go安裝
- 1.2 GOPATH 與工作空間
- 1.3 Go 命令
- 1.4 Go開發工具
- 1.5 小結
- 第二章 Go語言基礎
- 2.1 你好,Go
- 2.2 Go基礎
- 2.3 流程和函數
- 2.4 struct類型
- 2.5 面向對象
- 2.6 interface
- 2.7 并發
- 2.8 總結
- 第三章 Web基礎
- 3.1 Web工作方式
- 3.2 Go搭建一個Web服務器
- 3.3 Go如何使得Web工作
- 3.4 Go的http包詳解
- 3.5 小結
- 第四章 表單
- 4.1 處理表單的輸入
- 4.2 驗證表單的輸入
- 4.3 預防跨站腳本
- 4.4 防止多次遞交表單
- 4.5 處理文件上傳
- 4.6 小結
- 第五章 訪問數據庫
- 5.1 database/sql接口
- 5.2 使用MySQL數據庫
- 5.3 使用SQLite數據庫
- 5.4 使用PostgreSQL數據庫
- 5.5 使用beedb庫進行ORM開發
- 5.6 NOSQL數據庫操作
- 5.7 小結
- 第六章 session和數據存儲
- 6.1 session和cookie
- 6.2 Go如何使用session
- 6.3 session存儲
- 6.4 預防session劫持
- 6.5 小結
- 第七章 文本處理
- 7.1 XML處理
- 7.2 JSON處理
- 7.3 正則處理
- 7.4 模板處理
- 7.5 文件操作
- 7.6 字符串處理
- 7.7 小結
- 第八章 Web服務
- 8.1 Socket編程
- 8.2 WebSocket
- 8.3 REST
- 8.4 RPC
- 8.5 小結
- 第九章 安全與加密
- 9.1 預防CSRF攻擊
- 9.2 確保輸入過濾
- 9.3 避免XSS攻擊
- 9.4 避免SQL注入
- 9.5 存儲密碼
- 9.6 加密和解密數據
- 9.7 小結
- 第十章 國際化和本地化
- 10.1 設置默認地區
- 10.2 本地化資源
- 10.3 國際化站點
- 10.4 小結
- 第十一章 錯誤處理,調試和測試
- 11.1 錯誤處理
- 11.2 使用GDB調試
- 11.3 Go怎么寫測試用例
- 11.4 小結
- 第十二章 部署與維護
- 12.1 應用日志
- 12.2 網站錯誤處理
- 12.3 應用部署
- 12.4 備份和恢復
- 12.5 小結
- 第十三章 如何設計一個Web框架
- 13.1 項目規劃
- 13.2 自定義路由器設計
- 13.3 controller設計
- 13.4 日志和配置設計
- 13.5 實現博客的增刪改
- 13.6 小結
- 第十四章 擴展Web框架
- 14.1 靜態文件支持
- 14.2 Session支持
- 14.3 表單及驗證支持
- 14.4 用戶認證
- 14.5 多語言支持
- 14.6 pprof支持
- 14.7 小結
- 附錄A 參考資料