0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Go语言中的包

阿铭linux 来源:阿铭linux 2023-04-17 09:22 次阅读

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






审核编辑:刘清

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

    关注

    0

    文章

    102

    浏览量

    11422
  • HTML
    +关注

    关注

    0

    文章

    273

    浏览量

    29271
  • SMTP协议
    +关注

    关注

    0

    文章

    6

    浏览量

    6571
  • go语言
    +关注

    关注

    1

    文章

    157

    浏览量

    8927

原文标题:Go语言中的包

文章出处:【微信号:aming_linux,微信公众号:阿铭linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Go指针使用注意事项

    与C语言一样,Go语言中同样有指针,通过指针,我们可以只传递变量的内存地址,而不是传递整个变量,这在一定程度上可以节省内存的占用,但凡事有利有弊,Go指针在使用也有一些注意点,稍不留神
    发表于 08-14 11:48 277次阅读

    Go语言变量的命名和声明

    变量名 必须以一个 字母或下划线开头 ,后面可以跟任意数量的字母、数字或下划线,在 Go 语言中,变量名区分大小写字母。当然,上述的命名规则在命名 函数名 、 常量名 、 类型名 、 语句标号 和 包名 等都适用。
    发表于 07-19 18:23 443次阅读

    Go语言常量的声明

    Go 语言中, 常量 表示的是固定的值,常量表达式的值在编译期进行计算,常量的值不可以修改。例如:3 、 Let's go 、 3.14 等等。常量中的数据类型只可以是 布尔型 、 数字型 (整数型、浮点型和复数)
    发表于 07-20 15:24 275次阅读

    Go语言中的整数类型

    Go 语言中,整型可以细分成两个种类十个类型。
    发表于 07-20 15:25 337次阅读

    Go开发语言的优势在哪里?

    Go语言是谷歌发布的第二款开源编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性,并专门针对多处理器系统应用程序的编程进行了优化,开发速度极快,可以与C或C++媲美,而且更加安全、支持并行
    发表于 03-22 15:04

    go语言枚举类型怎么用

    go 语言枚举类型是这么用的?在什么场景下会用到枚举?本文对 go 语言枚举做了详细讲解。 枚举,是一种重要的数据类型,由一组键值对组成,通常用来在编程
    的头像 发表于 09-02 09:43 4882次阅读

    深入剖析Golang环境搭建

    安装Go Go的安装相比其他语言环境非常简单,直接下载安装包,解压安装即可。1、下载安装包(官方地址 //golang.org/dl/ 国内已被墙了),直接去对应的Go
    的头像 发表于 10-20 15:20 2588次阅读

    详细介绍go语言中的闭包的实现

    什么是闭包? 什么场景下会用闭包 ? 本文对 go 语言中的闭包做了详细介绍。 闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。 Go中的闭包 闭包是函数式语言中
    的头像 发表于 10-20 16:18 1681次阅读

    带你了解go语言中的闭包

      【 导读】什么是闭包? 什么场景下会用闭包 ? 本文对 go 语言中的闭包做了详细介绍。 闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。 Go中的闭包 闭包是函数式
    的头像 发表于 11-02 15:27 2192次阅读

    怎么利用反射实现json序列化和反序列化

    如果我要问你,你学习Go语言中遇到的最大难点在哪里? 我相信很多人都支支吾吾,说不出个所以然来,觉得每个都是难点,只有少部分人朋友能准确无误的令自己十分困扰的难点。 而我猜,70%的难点都是「反射
    的头像 发表于 11-09 11:06 1564次阅读
    怎么利用反射实现json序列化和反序列化

    studygolang Go语言中文网源码

    ./oschina_soft/studygolang.zip
    发表于 06-10 10:07 3次下载
    studygolang <b class='flag-5'>Go</b><b class='flag-5'>语言中</b>文网源码

    go语言中怎么使用HTTP代理

    go语言中怎么使用HTTP代理。
    的头像 发表于 09-01 14:41 2172次阅读

    嵌入式Linux应用开发之go方法与类成员函数

    Go语言中,接口就是方法签名(Method Signature)的集合。当一个类型实现了接口中的所有方法,我们称它实现了该接口,这与面向对象编程(OOP)的说法很类似。我们可以用接口来实现C++面向对象的多态。
    发表于 05-13 09:53 247次阅读

    Go 1.21的PGO正式GA,性能提升,更快更猛!

    Go 语言中,最初关于 PGO 的提案是建议向 Go GC 工具链增加对配置文件引导优化 (PGO) 的支持,以便工具链能根据运行时信息执行特定于应用程序和工作负载的优化。
    的头像 发表于 06-28 16:47 759次阅读
    <b class='flag-5'>Go</b> 1.21的PGO正式GA,性能提升,更快更猛!

    Go语言中的函数、方法与接口详解

    Go 没有类,不过可以为结构体类型定义方法。方法就是一类带特殊的接收者参数的函数。方法接收者在它自己的参数列表内,位于 func 关键字和方法名之间。(非结构体类型也可以定义方法)
    的头像 发表于 04-23 16:21 88次阅读