包
Package | 包
导入
import "fmt"
fmt
is the name of a package that includes a variety of functions related to formatting and output to the screen. Bundling code in this way serves 3 purposes:
- It reduces the chance of having overlapping names. This keeps our function names short and succinct
- It organizes code so that its easier to find code you want to reuse.
- It speeds up the compiler by only requiring recompilation of smaller chunks of a program. Although we use the package
fmt
, we don’t have to recompile it every time we change our program.
imports 应该按照字母顺序排序,并且按照,标准库,三方,二方,一方的顺序分节。特殊情况下,如有引用顺序的需求,通过空行实现。
未使用或副作用的导入
若导入某个包或声明某个变量而不使用它就会产生错误。未使用的包会让程序膨胀并拖慢编译速度,而已初始化但未使用的变量不仅会浪费计算能力,还有可能暗藏着更大的 Bug。然而在程序开发过程中,经常会产生未使用的导入和变量。
我们可以将未使用的变量 fd 赋予空白标识符,来关闭未使用变量错误。
package main
import (
"fmt"
"io"
"log"
"os"
)
var _ = fmt.Printf // For debugging; delete when done. // 用于调试,结束时删除。
var _ io.Reader // For debugging; delete when done. // 用于调试,结束时删除。
func main() {
fd, err := os.Open("test.go")
if err != nil {
log.Fatal(err)
}
// TODO: use fd.
_ = fd
}
空白赋值会将代码标识为工作正在进行中。但有时导入某个包只是为了其副作用,而没有任何明确的使用。例如,在 net/http/pprof 包的 init 函数中记录了 HTTP 处理程序的调试信息。它有个可导出的 API,但大部分客户端只需要该处理程序的记录和通过 Web 叶访问数据。只为了其副作用来哦导入该包,只需将包重命名为空白标识符:
import _ "net/http/pprof"
init 函数
每个源文件都可以通过定义自己的无参数 init 函数来设置一些必要的状态;每个文件都可以拥有多个 init 函数。只有该包中的所有变量声明都通过它们的初始化器求值后 init 才会被调用,而那些 init 只有在所有已导入的包都被初始化后才会被求值。除了那些不能被表示成声明的初始化外,init 函数还常被用在程序真正开始执行前,检验或校正程序的状态。
尽管 init 方法能够在同一个源文件中多次定义,并且顺序执行,应该尽量避免。同一个包下的多个源文件中的 init 执行顺序,依赖编译器 resolve 源代码文件的顺序,亦可以是手动指定文件的顺序,所以他们的执行顺序是不可靠的。所以一个包尽量一个 init 函数。
// main.go
package main
import (
"fmt"
)
func init() {
fmt.Println("main")
}
func main() {
}
// b.go
package main
import (
"fmt"
)
func init() {
fmt.Println("b")
}
$ go build -o main main.go b.go
$ ./main
main
b
$ go build -o main b.go main.go
./main
b
main