每个 Go 文件都属于且仅属于一个包,一个包可以由许多以 .go 为扩展名的源文件组成,因此文件名和包名一般来说都是不相同的。
你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:
package main
1、main包
每个Go应用程序都包含一个名为main的包,main包下可以有多个文件,但所有文件中只能有一个main() 方法,main()方法代表程序入口。
一个应用程序可以包含不同的包,而且即使你只使用main包也不必把所有的代码都写在一个文件里:你可以用一些较小的文件,并且在每个文件第一行都使用package main来指明这些文件都属于main包。
如果你打算编译包名不是为main的源文件,如pack1,编译后产生的对象文件将会是pack1.a,而不是可执行程序。另外要注意的是,所有的包名都应该使用小写字母。
2、标准库
Go程序自带的包合起来成为Go的标准库,前面我们用过fmt、os、net/http、strconv,除此之外还有如下常见的包:
包名 | 说明 |
bufio | 带缓冲的 I/O 操作 |
bytes | 实现字节操作 |
container | 封装堆、列表和环形列表等容器 |
crypto | 加密算法 |
database | 数据库驱动和接口 |
debug | 各种调试文件格式访问及调试功能 |
encoding | 常见算法如 JSON、XML、Base64 等 |
flag | 命令行解析 |
html | HTML 转义及模板系统 |
image | 常见图形格式的访问及生成 |
io | 实现 I/O 原始访问接口及访问封装 |
math | 数学库 |
net | 网络库,支持 Socket、HTTP、邮件、RPC、SMTP 等 |
path | 兼容各操作系统的路径操作实用函数 |
plugin | 支持将代码编译为插件,按需加载 |
reflect | 语言反射支持。可以动态获得代码中的类型信息,获取和修改变量的值 |
regexp | 正则表达式封装 |
runtime | 运行时接口 |
sort | 排序接口 |
strings | 字符串转换、解析及实用函数 |
time | 时间接口 |
text | 文本模板及 Token 词法器 |
标准库里的包,只需要在go程序里import后,就可以调用了。
3、自定义包
假定我们有两个包:aming和linux,下面来演示如何在aming包中导入linux包
1)两个包属于同一个项目
在这里,“项目”理解成就是一个目录(aming),在这个目录下还有一个子目录(linux),这个linux也就是要被导入的包
目录结构为:
aming/ ├── linux │ └── linux.go └── aming.go
先来定义linux包程序
mkdir -p aming/linux cdaming/linux cat > linux.go << EOF package linux //定义变量,变量名头字母大写,可以在外部调用 var Name = "linux" //函数名 头字母大写,表示该函数可以被其它程序调用 func Sum(n1, n2 int) int { return n1 + n2 } func Sub(n1, n2 int) int { return n1 - n2 } func Mul(n1, n2 int) int { return n1 * n2 } func Div(n1, n2 int) int { return n1 / n2 } EOF
初始化module
cd .. go mod init aming ##包的名字为aming
调用linux包
cat > aming.go << EOF package main import ( "fmt" "aming/linux" ) func main() { total := linux.Sum(3, 5) fmt.Println("3和5相加等于", total) fmt.Println("10除以2等于", linux.Div(10, 2)) fmt.Println("Name is:", linux.Name) } EOF
编译
go build
会在当前目录里生成可执行文件aming
执行
2)两个包为两个项目
目录结构为:
├── aming │ └── aming.go └── linux └── linux.go
先来定义linux包程序
mkdir -p aming linux cat > linux/linux.go << EOF package linux //定义变量,变量名头字母大写,可以在外部调用 var Name = "linux" //函数名 头字母大写,表示该函数可以被其它程序调用 func Sum(n1, n2 int) int { return n1 + n2 } func Sub(n1, n2 int) int { return n1 - n2 } func Mul(n1, n2 int) int { return n1 * n2 } func Div(n1, n2 int) int { return n1 / n2 } EOF
定义主程序
cat > aming.go << EOF package main import ( "fmt" "linux" ) func main() { total := linux.Sum(3, 5) fmt.Println("3和5相加等于", total) fmt.Println("10除以2等于", linux.Div(10, 2)) fmt.Println("Name is:", linux.Name) } EOF
此时运行程序会报错
go run aming.go aming.go:5:3: package linux is not in GOROOT (/opt/go/src/linux)
它会默认到$GOROOT下去找linux包,要解决此问题,可以将linux目录直接挪到$GOROOT下
mv ../linux /opt/go/src/
再次执行程序,正常
go run aming/aming.go 3和5相加等于8 10除以2等于5 Name is: linux
如果不想将linux目录挪到$GOROOT下,还有一种方法,定义go.mod即可,主要目的是为了让aming.go找到linux包
先把linux目录挪回来(注意,当前还是在aming目录里)
mv /opt/go/src/linux ../
初始化module
go mod init aming
到linux目录下,也要初始化module
cd linux go mod init linux
然后编辑aming目录下的go.mod,改为
module aming go1.20 require"linux"v0.0.0 replace "linux" => "../linux"
说明:require定义要依赖的包,replace定义该包在什么位置。
审核编辑:刘清
-
RPC
+关注
关注
0文章
111浏览量
11529 -
HTML
+关注
关注
0文章
278浏览量
35222 -
SMTP协议
+关注
关注
0文章
6浏览量
6593 -
go语言
+关注
关注
1文章
158浏览量
9047
原文标题:Go语言中的包
文章出处:【微信号:aming_linux,微信公众号:阿铭linux】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论