mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2024-12-01 10:38:59 +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的单位转换,长度单位可以对应英尺和米,重量单位可以对应磅和公斤等。
|