2015-12-09 07:45:11 +00:00
|
|
|
|
### 2.6.1. 導入包
|
|
|
|
|
|
2015-12-26 12:53:13 +00:00
|
|
|
|
在Go語言程序中,每個包都是有一個全局唯一的導入路徑。導入語句中類似"gopl.io/ch2/tempconv"的字符串對應包的導入路徑。Go語言的規范併沒有定義這些字符串的具體含義或包來自哪里,它們是由構建工具來解釋的。當使用Go語言自帶的go工具箱時(第十章),一個導入路徑代表一個目録中的一個或多個Go源文件。
|
2015-12-09 07:45:11 +00:00
|
|
|
|
|
2015-12-26 12:53:13 +00:00
|
|
|
|
除了包的導入路徑,每個包還有一個包名,包名一般是短小的名字(併不要求包名是唯一的),包名在包的聲明處指定。按照慣例,一個包的名字和包的導入路徑的最後一個字段相同,例如gopl.io/ch2/tempconv包的名字一般是tempconv。
|
2015-12-09 07:45:11 +00:00
|
|
|
|
|
2015-12-26 12:53:13 +00:00
|
|
|
|
要使用gopl.io/ch2/tempconv包,需要先導入:
|
2015-12-09 07:45:11 +00:00
|
|
|
|
|
|
|
|
|
```Go
|
|
|
|
|
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))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2015-12-26 12:53:13 +00:00
|
|
|
|
導入語句將導入的包綁定到一個短小的名字,然後通過該短小的名字就可以引用包中導出的全部內容。上面的導入聲明將允許我們以tempconv.CToF的形式來訪問gopl.io/ch2/tempconv包中的內容。在默認情況下,導入的包綁定到tempconv名字(譯註:這包聲明語句指定的名字),但是我們也可以綁定到另一個名稱,以避免名字衝突(§10.3)。
|
2015-12-09 07:45:11 +00:00
|
|
|
|
|
2015-12-26 12:53:13 +00:00
|
|
|
|
cf程序將命令行輸入的一個溫度在Celsius和Fahrenheit溫度單位之間轉換:
|
2015-12-09 07:45:11 +00:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ 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
|
|
|
|
|
```
|
|
|
|
|
|
2015-12-26 12:53:13 +00:00
|
|
|
|
如果導入了一個包,但是又沒有使用該包將被當作一個編譯錯誤處理。這種強製規則可以有效減少不必要的依賴,雖然在調試期間可能會讓人討厭,因爲刪除一個類似log.Print("got here!")的打印語句可能導致需要同時刪除log包導入聲明,否則,編譯器將會發出一個錯誤。在這種情況下,我們需要將不必要的導入刪除或註釋掉。
|
2015-12-09 07:45:11 +00:00
|
|
|
|
|
2015-12-26 12:53:13 +00:00
|
|
|
|
不過有更好的解決方案,我們可以使用golang.org/x/tools/cmd/goimports導入工具,它可以根據需要自動添加或刪除導入的包;許多編輯器都可以集成goimports工具,然後在保存文件的時候自動運行。類似的還有gofmt工具,可以用來格式化Go源文件。
|
2015-12-09 07:45:11 +00:00
|
|
|
|
|
2015-12-26 12:53:13 +00:00
|
|
|
|
**練習 2.2:** 寫一個通用的單位轉換程序,用類似cf程序的方式從命令行讀取參數,如果缺省的話則是從標準輸入讀取參數,然後做類似Celsius和Fahrenheit的單位轉換,長度單位可以對應英尺和米,重量單位可以對應磅和公斤等。
|
2015-12-09 07:45:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|