mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2024-11-16 19:33:47 +00:00
56 lines
2.9 KiB
Markdown
56 lines
2.9 KiB
Markdown
### 2.6.1. 導入包
|
||
|
||
在Go語言程序中,每個包都是有一個全局唯一的導入路徑。導入語句中類似"gopl.io/ch2/tempconv"的字符串對應包的導入路徑。Go語言的規范併沒有定義這些字符串的具體含義或包來自哪里,它們是由構建工具來解釋的。當使用Go語言自帶的go工具箱時(第十章),一個導入路徑代表一個目録中的一個或多個Go源文件。
|
||
|
||
除了包的導入路徑,每個包還有一個包名,包名一般是短小的名字(併不要求包名是唯一的),包名在包的聲明處指定。按照慣例,一個包的名字和包的導入路徑的最後一個字段相同,例如gopl.io/ch2/tempconv包的名字一般是tempconv。
|
||
|
||
要使用gopl.io/ch2/tempconv包,需要先導入:
|
||
|
||
<u><i>gopl.io/ch2/cf</i></u>
|
||
```Go
|
||
// 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的單位轉換,長度單位可以對應英尺和米,重量單位可以對應磅和公斤等。
|