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
上一页