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

    文章

    111

    浏览量

    11529
  • HTML
    +关注

    关注

    0

    文章

    278

    浏览量

    35222
  • SMTP协议
    +关注

    关注

    0

    文章

    6

    浏览量

    6593
  • go语言
    +关注

    关注

    1

    文章

    158

    浏览量

    9047

原文标题:Go语言中的包

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

收藏 人收藏

    评论

    相关推荐

    Go语言变量的命名和声明

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

    Go语言常量的声明

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

    Go语言中的整数类型

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

    【MYS-6ULX-IOT试用体验】Go语言与GPIO: 1 控制用户LED

    ("0")time.Sleep(time.Millisecond * 500)} }()这里实现了LED的闪烁 go func() { }()在Go语言中,每一个并发的执行单元叫作一个
    发表于 06-20 09:40

    Go语言开发有什么优势?怎么学?

      目前很多IT界的朋友们开始了学习Go这个语言,作为最近几年比较火的服务端开发语言,其开发效率高的特性,使得它迅速的占领了各大公司的服务端开发领域。相比其他服务端开发语言
    发表于 12-19 16:08

    go语言能做什么工作?

    :网络流量抓和重放工具Go语言作为一门大型项目开发语言,在很多大公司相继使用,甚至完全转向Go开发,其中代表有Google、Faceboo
    发表于 03-22 15:03

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

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

    C语言中的关键字

    C语言中的入门教程
    发表于 10-14 16:24 3次下载

    网易有道CEO周枫推荐Go语言并介绍Go语言的3个优点

    网易有道CEO周枫推荐Go语言。他认为Go很好地继承了C语言灵活、简单有效的思想;Go有很高的生产效率;
    的头像 发表于 01-31 14:11 5203次阅读

    详解GO语言的趋势与使用情况

    Go 语言简单易学、性能优良。JetBrains Blog 发布了Go 语言的调查报告,看看GO 语言
    的头像 发表于 03-17 11:05 3047次阅读

    go语言枚举类型怎么用

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

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

    什么是闭? 什么场景下会用闭 ? 本文对 go 语言中的闭做了详细介绍。 闭是由函数及其
    的头像 发表于 10-20 16:18 1857次阅读

    Go语言sync中的锁都在什么场景下用

    Go 语言 sync 中的锁都在什么场景下用?怎么用?本文对 sync 内的锁做了梳理。 今天谈一下锁,以及 Go 里面 Sync
    的头像 发表于 10-26 09:35 2195次阅读

    带你了解go语言中的闭

      【 导读】什么是闭? 什么场景下会用闭 ? 本文对 go 语言中的闭做了详细介绍。 闭
    的头像 发表于 11-02 15:27 2443次阅读

    go语言中怎么使用HTTP代理

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