Skip to content

Go 语言笔记:包和文件

导包的方式

单个包的导入

go
import "fmt"

多个包的导入

go
import (
    "fmt"
    "strings"
)

包导入之后必须使用, 否则编译器会提示: Unused import,如果必须导入,可以使用匿名导入的方式

匿名、别名、全量导入

go
package main

import (
    _ "image/png"  // 匿名导入
    . "math"       // 全量导入
    str "strings"  // 别名导入
)

func main() {
    // 使用别名调用其方法
    str.Split("lemon", "")
    // 全量导入后,直接像调用本文件的函数一样调用其函数即可
    Abs(3)
}

匿名导包,主要是为了解决代码中没有显式调用该包的函数但执行又必须需要时,编译器提示Unused import 的问题,如图片格式转换, 使用命令 cat demo.png | go run convert.go > demo.jpeg 执行转换, convert.go 文件内容如下

go
package main

import (
	"fmt"
	"image"
	"image/jpeg"
	"os"
)

func main() {
	img, kind, err := image.Decode(os.Stdin)
	if err != nil {
		_, _ = fmt.Fprintf(os.Stderr, "err: %v\n", err)
		return
	}
	_, _ = fmt.Fprintf(os.Stderr, "input format: %v\n", kind)
	_ = jpeg.Encode(os.Stdout, img, &jpeg.Options{Quality: 95})
}

init 函数执行流程

有项目路径如下:

go
lemon
    ├── lib1
    │   └── lib1.go
    ├── lib2
    │   └── lib2.go
    └── main.go

lib1 包中 文件 lib2.go 内容为:

go
package lib1

import "fmt"

// 这里函数大写开头表示可以被外部包引入后调用
// 小写开头只能在本包中调用
func Say() {
	fmt.Println("Hi.")
}

func init() {
	fmt.Println("I'm in lib1.")
}

lib2 包中 文件 lib2.go 内容为:

go
package lib2

import "fmt"

func Say() {
	fmt.Println("Hello.")
}

func init() {
	fmt.Println("I'm in lib2.")
}

main.go 内容如下:

go
package main

import (
	"lemon/lib1"
	"lemon/lib2"
)

func main() {
	lib2.Say()
	lib1.Say()
}

执行 main 函数,结果如下:

go
I'm in lib1.
I'm in lib2.
Hello.
Hi.

可以看到 init 函数执行的时间是按照被 main 包导入的顺序执行的。

Released under the MIT License.