跳到主要内容

Go package 和 import

package

在 Go 语言中,每个 Go 文件都属于一个包,这意味着每个文件的开头都必须声明这个文件属于哪个包。使用 package 关键字来声明包名。

每个 Go 程序都有一个入口点,即 main 包。这个包通常定义在一个名为 main.go 的文件中,包含了 main 函数。

包可以被其他包导入,允许使用该包中公开的类型、函数、变量等。需要注意,只有首字母大写的标识符才是公开的(导出的)。

包名通常是其源代码目录的最后一个元素,不需要和目录名完全一致,但按照约定,包名应该是小写的。

package mypackage // 定义了一个名为 mypackage 的包

使用 package 的注意事项

包名应该简短且有意义,通常与目录名一致。

每个目录下的所有文件都应该属于同一个包。

在同一个包中,不能有重复的函数或类型名。

如果包名与标准库中的包名相同,可能会引起冲突,应当避免。

当使用多个包时,注意包的初始化顺序。Go 会根据依赖关系自动确定初始化顺序。

import

import 关键字用于导入其他包,使当前文件可以使用被导入包中公开的名称(如函数、类型、变量等)。

可以单个导入,也可以分组导入。

如果导入一个包而没有使用它,Go 编译器会报错。这是 Go 语言强制代码清晰简洁的一种方式。

单个导入

import "fmt"
import "mypackage"

分组导入

import (
"fmt"
"mypackage"
)

给导入的包起别名

如果导入的包名过长或者不同包有相同的名字,可以给包起一个别名。

import (
f "fmt"
mp "myproject/mypackage"
)

使用导入的包

导入包后,可以使用包名作为前缀来调用该包中的公开名称。

package main

import (
"fmt"
"mypackage"
)

func main() {
fmt.Println("sumingcheng")
mypackage.MyFunction() // 假设 mypackage 中有一个公开的 MyFunction 函数
}

注意

在 Go 模块化模式下(Go 1.11 及以上版本),当你导入包时,需要基于模块路径。这意味着你可能需要在 go.mod 文件中有相应的依赖声明。

import 的特殊用法

空白标识符导入

如果你想执行一个包中的 init() 函数,但不使用包中的其他任何内容,可以使用空白标识符导入。

import _ "net/http/pprof"

点操作符导入

使用点操作符,可以在使用导入包的标识符时省略包名前缀。

import . "fmt"

func main() {
Println("sumingcheng") // 无需 fmt. 前缀
}

笔者建议尽量避免使用这些特殊导入方式,以保持代码的清晰度。

编译时的注意事项

编译文件夹下所有的 proto 文件

在使用 Protocol Buffers 时,你可能需要编译当前目录及其子目录下的所有 .proto 文件。以下是命令的解释:

protoc -I . ./**/*.proto --go_out=plugins=grpc:./pb/

protoc

这是 Protocol Buffers 的编译器命令,用于编译 .proto 文件。

-I .

指定了包含 .proto 文件的目录,这里是当前目录 .

.

指定了在哪个目录下查找 .proto 文件,这里同样是当前目录。

./**/*.proto

匹配当前目录及其所有子目录中的所有 .proto 文件。这里的 **/*.proto 表示任意级别的子目录中的所有 .proto 文件。

--go_out=plugins=grpc:./pb/

指定了生成的 Go 代码的输出目录和配置。--go_out 指定了输出目录,plugins=grpc 表示使用 gRPC 插件。这意味着除了生成普通的 Go 代码外,还会生成支持 gRPC 的代码。:./pb/ 指定了输出目录,这里是当前目录下的 pb 子目录。

编译时的注意事项

编译 .proto 文件时,需要注意以下几点。

首先,确保 protoc 已安装,并且 protoc-gen-go 插件已正确配置。

其次,生成的代码应与使用的 Protocol Buffers 版本兼容。

另外,pb 目录应存在,或者确保 protoc 能够创建它。

假设你有以下目录结构

.
├── proto
│ ├── user.proto
│ └── order.proto
└── main.go

可以使用以下命令编译所有 .proto 文件。

protoc -I . ./proto/*.proto --go_out=plugins=grpc:./pb/

这样,所有的生成文件都会放在 pb 目录下,方便在代码中导入和使用。