## 6.3\. 新建一個包
根據一般約定,導入路徑為x/y的包的源代碼應放在$GOROOT/src/pkg/x/y目錄中。
### 6.3.1\. Makefile
如果能有專門針對Go的工具能檢測源代碼文件,決定編譯順序就好了,但現在,我們還只能用GNU的make。所以,新建包首先要新建的文件就是Makefile。如果是在Go源代碼樹中,其基本格式可參照src/pkg/container/vector/Makefile:
```
include ../../../Make.inc
TARG=container/vector
GOFILES= intvector.go stringvector.go vector.go include ../../../Make.pkg
```
在Go的源代碼樹之外(個人包),標準的格式則是:
```
include $(GOROOT)/src/Make.inc
TARG=mypackage
GOFILES= my1.go my2.go include $(GOROOT)/src/Make.pkg
```
第一行和最后一行分別導入了標準定義和規則。Go源代碼樹中所維護的包使用相對路徑(代替$(GOROOT)/src),所以即使是$(GOROOT) 中含有空格也可以正常使用。這無疑簡化了程序員嘗試Go的難度。
如果沒有設置$GOROOT環境變量,在運行gomake時就必須使用第二種makefile。即使系統中的GNU Make的名字是gmake而不是make,Gomake也能正常的調用它。
TARG 是這個包的目標安裝路徑,就是客戶用來導入這個包的字符串。在Go的源代碼樹種,這個字符串必須跟Makefile中的目錄保持一致,不需 要$GOROOT/src/pkg/前綴。在Go的源代碼樹之外,則可以使用任何跟標準Go包名稱不沖突的TARG。一個常見的規則是用一個獨有的名稱把 自己的包組合在一起,例如:myname/tree、 myname/filter等。注意,即使包的源代碼是放在Go源代碼樹外部,為了便于編譯器找到你的包,運行make install之后最好也把編譯后的包放到標準位置,即$GOROOT/pkg。
GOFILES是創建包所需要編譯的源代碼文件清單。用反斜杠符號\就能將這份清單分成多行,方便排序。
如果在Go的源代碼樹中新建包目錄,只需要將其添加到$GOROOT/src/pkg/Makefile的清單中,就能將其包含在標準構建中。然后運行:
```
cd $GOROOT/src/pkg
./deps.bash
```
這是更新依賴文件Make.deps。(每次運行all.bash或make.bash時都會自動執行此操作。)
如果是修改一個已有的包,就不需要編輯$GOROOT/src/pkg/Makefile,不過運行deps.bash還是必須的。
### 6.3.2\. Go源文件
對于每個源代碼文件,在Makefile中的命令首先是包的名稱,該名稱也是導入包的默認名稱。(同一個包中所有文件必須使用同一個名稱。)Go的規則是, 包的名稱是導入路徑的最后一個元素,例如以“crypto/rot13”為導入路徑的包的名稱應該是rot13。現在,Go工具還要求鏈接到同一個二進制 文件的所有包的名稱都應該是唯一的,但這個限制很快就會被移除。
Go會一次性編譯包中所有的源代碼文件,所以源代碼中可以試用其它文件中的常量、變量、類型和函數,而無需特別的安排或聲明。
編寫簡潔易懂的Go代碼超出了本文檔的范圍。Effective Go對此有介紹。
- 1. 關于本文
- 2. Go語言簡介
- 3. 安裝go環境
- 3.1. 簡介
- 3.2. 安裝C語言工具
- 3.3. 安裝Mercurial
- 3.4. 獲取代碼
- 3.5. 安裝Go
- 3.6. 編寫程序
- 3.7. 進一步學習
- 3.8. 更新go到新版本
- 3.9. 社區資源
- 3.10. 環境變量
- 4. Go語言入門
- 4.1. 簡介
- 4.2. Hello,世界
- 4.3. 分號(Semicolons)
- 4.4. 編譯
- 4.5. Echo
- 4.6. 類型簡介
- 4.7. 申請內存
- 4.8. 常量
- 4.9. I/O包
- 4.10. Rotting cats
- 4.11. Sorting
- 4.12. 打印輸出
- 4.13. 生成素數
- 4.14. Multiplexing
- 5. Effective Go
- 5.1. 簡介
- 5.2. 格式化
- 5.3. 注釋
- 5.4. 命名
- 5.5. 分號
- 5.6. 控制流
- 5.7. 函數
- 5.8. 數據
- 5.9. 初始化
- 5.10. 方法
- 5.11. 接口和其他類型
- 5.12. 內置
- 5.13. 并發
- 5.14. 錯誤處理
- 5.15. Web服務器
- 6. 如何編寫Go程序
- 6.1. 簡介
- 6.2. 社區資源
- 6.3. 新建一個包
- 6.4. 測試
- 6.5. 一個帶測試的演示包
- 7. Codelab: 編寫Web程序
- 7.1. 簡介
- 7.2. 開始
- 7.3. 數據結構
- 7.4. 使用http包
- 7.5. 基于http提供wiki頁面
- 7.6. 編輯頁面
- 7.7. template包
- 7.8. 處理不存在的頁面
- 7.9. 儲存頁面
- 7.10. 錯誤處理
- 7.11. 模板緩存
- 7.12. 驗證
- 7.13. 函數文本和閉包
- 7.14. 試試!
- 7.15. 其他任務
- 8. 針對C++程序員指南
- 8.1. 概念差異
- 8.2. 語法
- 8.3. 常量
- 8.4. Slices(切片)
- 8.5. 構造值對象
- 8.6. Interfaces(接口)
- 8.7. Goroutines
- 8.8. Channels(管道)
- 9. 內存模型
- 9.1. 簡介
- 9.2. Happens Before
- 9.3. 同步(Synchronization)
- 9.4. 錯誤的同步方式
- 10. 附錄
- 10.1. 命令行工具
- 10.2. 視頻和講座
- 10.3. Release History
- 10.4. Go Roadmap
- 10.5. 相關資源