gopl-zh.github.com/ch2/ch2-06-1.md
2015-12-18 10:53:03 +08:00

2.8 KiB

2.6.1. 導入包

在Go程序中, 每個包都是有一個全侷唯一的導入路徑. 聲明中類似 "gopl.io/ch2/tempconv" 的字符串對應導入路徑. 語言的規範並沒有定義這些字符串的具體含義或包來自哪裡, 它們是由工具來解釋. 當使用 go 工具箱時(第十章), 一個導入路徑代表一個目録中的一個或多個Go源文件.

除了到導入路徑, 每個包還有一個包名, 包名一般是短小的(也不要求是是唯一的), 包名在包的聲明處指定. 按照慣例, 一個包的名字和包的導入路徑的最後一個字段相同, 例如 gopl.io/ch2/tempconv 包的名字是 tempconv.

要使用 gopl.io/ch2/tempconv 包, 需要先導入:

gopl.io/ch2/cf 
// Cf converts its numeric argument to Celsius and Fahrenheit. 
package main 

import ( 
	"fmt" 
	"os" 
	"strconv" 

	"gopl.io/ch2/tempconv" 
) 

func main() { 
	for _, arg := range os.Args[1:] { 
		t, err := strconv.ParseFloat(arg, 64) 
		if err != nil { 
			fmt.Fprintf(os.Stderr, "cf: %v\n", err) 
			os.Exit(1) 
		} 
		f := tempconv.Fahrenheit(t) 
		c := tempconv.Celsius(t) 
		fmt.Printf("%s = %s, %s = %s\n", 
			f, tempconv.FToC(f), c, tempconv.CToF(c)) 
	} 
} 

導入聲明將導入的包綁定到一個短小的名字, 然後通過該名字就可以引用包中導齣的全部內容. 上面的導入聲明將允許我們以 tempconv.CToF 的方式來訪問 gopl.io/ch2/tempconv 包中的內容. 默認情況下, 導入的包綁定到 tempconv 名字, 但是我們也可以綁定到另一個名稱, 以避免名字沖突(§10.3).

cf 程序將命令行輸入的一個溫度在 Celsius 和 Fahrenheit 之間轉換:

$ go build gopl.io/ch2/cf 
$ ./cf 32 
32°F = 0°C, 32°C = 89.6°F 
$ ./cf 212 
212°F = 100°C, 212°C = 413.6°F 
$ ./cf -40 
-40°F = -40°C, -40°C = -40°F 

如果導入一個包, 但是沒有使用該包將被當作一個錯誤. 這種強製檢測可以有效減少不必要的依賴, 雖然在調試期間會讓人討厭, 因爲刪除一個類似 log.Print("got here!") 的打印可能導緻需要同時刪除 log 包導入聲明, 否則, 編譯器將會發齣一個錯誤. 在這種情況下, 我們需要將不必要的導入刪除或註釋掉.

不過有更好的解決方案, 我們可以使用 golang.org/x/tools/cmd/goimports 工具, 它可以根據需要自動添加或刪除導入的包; 許多編輯器都可以集成 goimports 工具, 然後在保存文件的時候自動允許它. 類似的還有 gofmt 工具, 可以用來格式化Go源文件.

練習 2.2: 寫一個通用的單位轉換程序, 用類似 cf 程序的方式從命令行讀取參數, 如果缺省的話則是從標準輸入讀取參數, 然後做類似 Celsius 和 Fahrenheit 的轉換, 長度單位對應英尺和米, 重量單位對應磅和公斤 等等.