全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 接口/总线/驱动 >

Go语言中的包

时间:2023-04-17 09:22

人气:

作者:admin

标签: SMTP协议  RPC  html  go语言 

导读:每个 Go 文件都属于且仅属于一个包,一个包可以由许多以 .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
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

执行

efd058aa-dcbb-11ed-bfe3-dac502259ad0.png

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定义该包在什么位置。






审核编辑:刘清

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信