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 目录下,方便在代码中导入和使用。