gopl-zh.github.com/ch2/ch2-06-1.md
2016-01-07 15:02:42 +08:00

3.0 KiB
Raw Blame History

2.6.1. 導入包

在Go語言程序中每個包都是有一個全局唯一的導入路徑。導入語句中類似"gopl.io/ch2/tempconv"的字符串對應包的導入路徑。Go語言的規范併沒有定義這些字符串的具體含義或包來自哪里它們是由構建工具來解釋的。當使用Go語言自帶的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.4)。

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的單位轉換長度單位可以對應英尺和米重量單位可以對應磅和公斤等。