Go语言中的包

描述

每个 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
cd aming/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

执行

go语言

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


go 1.20
require "linux" v0.0.0
replace "linux" => "../linux"

 

说明:require定义要依赖的包,replace定义该包在什么位置。






审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分