Go语言包和包管理详解
来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《Go语言包和包管理详解》,介绍一下包、包管理,希望对大家的知识积累有所帮助,助力实战开发!
1 包简介
1.1 工作空间
go语言的工作空间必须由 bin、pkg、src三个目录组成,可以在GOPATH
环境变量中添加多个工作空间,但不能和GOROOT
相同。通常go get
使用第一个工作空间保存下载的第三方库
workspace | +--- bin // go install 安装目录。 | | | +--- learn | | +--- pkg // go build ⽣成静态库 (.a) 存放目录。 | | | +--- darwin_amd64 | | | +--- mylib.a | | | +--- mylib | | | +--- sublib.a | +--- src // 项目源码目录。 | +--- learn | | | +--- main.go | | +--- mylib | +--- mylib.go | +--- sublib | +--- sublib.g
1.2 源文件
- 编码:源码⽂件必须是 UTF-8 格式,否则会导致编译器出错。
- 结束:语句以 “;” 结束,多数时候可以省略。
- 注释:⽀持 “//”、 “/**/” 两种注释⽅式,不能嵌套。
- 命名:采⽤ camelCasing ⻛格,不建议使⽤下划线。
1.3 包命名
::: tip 包命名惯例
- 给包命名的惯例是使用包所在目录的名字。这让用户在导入包的时候,就能清晰地知道包名。
- 尽量使用简介明了的名字,但要避免冲突
- 包名一般使用单数的形式,但是避免冲突的用的复数比如bytes,errors,strings等
- 要避免包名有其他含义。比如 temp这种
- 命名时考虑包名和成员如何配合,尽量减少包名和成员有重复 :::
1.4 main 包
- 所有用 Go 语言编译的可执行程序都必须有一个名叫 main 的包。 go语言的编译器会将这种名字的包编译为二进制可执行文件。
- main包下肯定会有名为main()的函数,main()是程序的入口。
- 编译完会使用声明 main 包的代码所在的目录的目录名作为二进制可执行文件的文件名
2导包
关键字 Import ,进行导包。未使用的导入包,会编译错误。
2.1 两种方式
import a import b,…多次导入,以及import(a b c) 批量导入,如果导入的包不使用会报错。
import "fmt" //或者 import( "fmt" "time" )
2.2 包的别名
import( io "fmt" ) io.Println("hello world") //别名可以直接用,在包重名时很有用
2.3 简洁模式
import ( . "fmt" //但是为了别人好看,一般还是不用这种 ) func main(){ Println("hello") }
2.4非导入模式(匿名导入)
即导入一个包并不使用它。如果不加_,就会出现编译错误。 在这里用下划线 _ 重命名导入的包。只导入,不使用。 但是这个包它进行了初始化,一般在init
函数调用,这样做的好处是,有些包我们不显示使用它,但是有可能用到它,或者由用户选择使用哪个。比如 对特定图像驱动包的初始化,在我们格式化转换图片用到。还有 database/sql
包,可以先都初始化,让用户选择不同的数据库驱动。
import _ "test" //非导入模式:仅让该包执行初始化函数
2.5 导包的路径
一般情况下是包的相对路径。比如import "learn/test"
,标准库中的包会在安装 Go 的位置找到,即GOROOT
。 Go 开发者创建的包会在 GOPATH
环境变量指定的目录里查找。GOPATH
指定的这些目录就是开发者的个人工作空间。
2.6 远程导入
目前的大势所趋是,使用分布式版本控制系统(Distributed Version Control Systems, DVCS)
来分享代码,如 GitHub
、 Launchpad
还有 Bitbucket
。 Go 语言的工具链本身就支持从这些网站及 类似网站获取源代码。 Go 工具链会使用导入路径确定需要获取的代码在网络的什么地方。
比如:import "github.com/xxxx/xxx"
,用导入路径编译程序时, go build 命令会使用 GOPATH
的设置,在磁盘上搜索这个包。事实上, 这个导入路径代表一个URL,指向 GitHub
上的代码库。如果路径包含 URL,可以使用 Go 工具链从 DVCS
获取包,并把包的源代码保存在GOPATH
指向的路径里与 URL 匹配的目录里。这个获取过程 使用 go get 命令完成。
go get 将获取任意指定的 URL 的包,或者一个已经导入的包所依赖的其 他包。由于 go get的这种递归特性,这个命令会扫描某个包的源码树,获取能找到的所有依赖包。
3 初始化 init
每个包可以包含任意多个 init 函数,这些函数都会在程序执行开始的时候被调用。所有被编译器发现的 init 函数都会安排在 main 函数之前执行。 init 函数用在设置包、初始化变量或者其他要在程序运行前优先完成的引导工作。举例如下
package postgres import ( "database/sql" ) func init() { //初始化函数 //这里省略。。 sql.Register("postgres", new(PostgresDriver)) }
3.1 init总结
- 每个源⽂件都可以定义⼀个或多个初始化函数。
- 编译器不保证多个初始化函数执行次序。
- 初始化函数在单⼀线程被调用,仅执行⼀次。
- 初始化函数在包所有全局变量初始化后执行。
- 在所有初始化函数结束后才执行 main.main。
- 无法调用初始化函数。
4 包管理
4.1 演变过程
- 2013年:Gedep,社区第一个包管理工具
- 2015年:vendor,Golang官方(golang1.5)
- 2016、2017 年:dep、manul、Godep、Govendor、godm (Govendor胜出)
- go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。
4.2 Go Model优点
- 不必须将项目目录放在GOPATH中
- 不使用vendor目录,而是统一安装到$GOPATH/pkg/mod/cache
- build/run时,自动析出项目import的包并安装
4.3 启用go module
要启用go module
支持首先要设置环境变量GO111MODULE
,通过它可以开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是auto。 设置GO111MODULE=on
之后就可以使用go module
了,以后就没有必要在GOPATH
中创建项目了,并且还能够很好的管理项目依赖的第三方包信息。 使用 go module
管理依赖后会在项目根目录下生成两个文件go.mod
和go.sum
。
GO111MODULE=off
禁用模块支持,编译时会从GOPATH
和vendor
文件夹中查找包。GO111MODULE=on
启用模块支持,编译时会忽略GOPATH
和vendor
文件夹,只根据go.mod
下载依赖。GO111MODULE=auto
,当项目在$GOPATH/src
外且项目根目录有go.mod
文件时,开启模块支持。
4.4 GOPROXY
Go1.13之后GOPROXY
默认值为proxy.golang.org,在国内是无法访问的,所以十分建议大家设置GOPROXY
5 go mod详解
5.1 go mod命令
常用的go mod命令如下:
go mod命令 | 描述 |
---|---|
go mod download | 下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录) |
go mod edit | 编辑go.mod文件 |
go mod graph | 打印模块依赖图 |
go mod init | 初始化当前文件夹, 创建go.mod文件 |
go mod tidy | 增加缺少的module,删除无用的module |
go mod vendor | 将依赖复制到vendor下 |
go mod verify | 校验依赖 |
go mod why | 解释为什么需要依赖 |
5.2 go.mod说明
go.mod
文件记录了项目所有的依赖信息,其结构大致如下:
module github.com/ourlang/studygo/myblog go 1.13 require ( github.com/DeanThompson/ginpprof v0.0.0-20190408063150-3be636683586 github.com/gin-gonic/gin v1.4.0 github.com/go-sql-driver/mysql v1.4.1 github.com/jmoiron/sqlx v1.2.0 github.com/satori/go.uuid v1.2.0 google.golang.org/appengine v1.6.1 // indirect )
- module用来定义包名
- require用来定义依赖包及版本
- indirect表示间接引用
5.2.1 依赖的版本
go mod
支持语义化版本号,比如go get foo@v1.2.3
,也可以跟git的分支或tag,比如go get foo@master
,当然也可以跟git提交哈希,比如go get foo@e3702bed2
。关于依赖的版本支持以下几种格式:
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 gopkg.in/vmihailenco/msgpack.v2 v2.9.1 gopkg.in/yaml.v25.2.2 replace
在国内访问
golang.org/x
的各个包都需要翻墙,你可以在go.mod
中使用replace
替换成github
上对应的库。replace ( golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac golang.org/x/net v0.0.0-20180821023952-922f4815f713 => github.com/golang/net v0.0.0-20180826012351-8a410e7b638d golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0 )5.3 go get
::: tip 在项目中执行go get命令可以下载依赖包,并且还可以指定下载的版本。
- 运行
go get -u
将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号) - 运行
go get -u=patch
将会升级到最新的修订版本 - 运行
go get package@version
将会升级到指定的版本号version
- 如果下载所有依赖可以使用
go mod download
命令。 :::
5.3.1 整理依赖
我们在代码中删除依赖代码后,相关的依赖库并不会在go.mod
文件中自动移除。这种情况下我们可以使用go mod tidy
命令更新go.mod
中的依赖关系
5.4 go mod edit
5.4.1 格式化
因为我们可以手动修改go.mod文件,所以有些时候需要格式化该文件。Go提供了一下命令:
go mod edit -fmt
5.4.2 添加依赖项
go mod edit -require=golang.org/x/text
5.4.3 移除依赖项
如果只是想修改go.mod
文件中的内容,那么可以运行go mod edit -droprequire=package path
,比如要在go.mod
中移除golang.org/x/text
包,可以使用如下命令
go mod edit -droprequire=golang.org/x/text
6 项目中使用go module
6.1 现有项目
如果需要对一个已经存在的项目启用go module
,可以按照以下步骤操作:
- 在项目目录下执行
go mod init
,生成一个go.mod
文件。 - 执行
go get
,查找并记录当前项目的依赖,同时生成一个go.sum
记录每个依赖库的版本和哈希值
6.2 新项目
对于一个新创建的项目,我们可以在项目文件夹下按照以下步骤操作:
- 执行
go mod init 项目名
命令,在当前项目文件夹下创建一个go.mod
文件。 - 手动编辑
go.mod
中的require
依赖项或执行go get
自动发现、维护依赖。
终于介绍完啦!小伙伴们,这篇关于《Go语言包和包管理详解》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

- 上一篇
- Golang 动态脚本调研详解

- 下一篇
- Go中的应用配置管理详解
-
- 有魅力的鼠标
- 这篇技术文章太及时了,很详细,很好,码起来,关注老哥了!希望老哥能多写Golang相关的文章。
- 2023-05-23 00:49:07
-
- 复杂的万宝路
- 这篇文章内容真及时,好细啊,很棒,已加入收藏夹了,关注大佬了!希望大佬能多写Golang相关的文章。
- 2023-04-25 07:57:50
-
- 光亮的滑板
- 写的不错,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢作者分享技术贴!
- 2023-04-15 01:55:27
-
- 欣喜的服饰
- 这篇文章太及时了,作者大大加油!
- 2023-03-26 01:21:14
-
- 激动的黑夜
- 很详细,mark,感谢up主的这篇博文,我会继续支持!
- 2023-03-21 17:42:43
-
- 受伤的康乃馨
- 这篇文章太及时了,很详细,受益颇多,已收藏,关注大佬了!希望大佬能多写Golang相关的文章。
- 2023-03-16 18:38:12
-
- 风中的月饼
- 赞 👍👍,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢作者大大分享文章!
- 2023-03-15 04:54:45
-
- 复杂的柚子
- 太给力了,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢大佬分享文章!
- 2023-03-06 22:26:01
-
- 花痴的烤鸡
- 细节满满,码住,感谢作者的这篇技术文章,我会继续支持!
- 2023-03-02 04:35:41
-
- Golang · Go教程 | 33分钟前 |
- Go语言中sync.Once复杂场景使用及问题分析
- 223浏览 收藏
-
- Golang · Go教程 | 2小时前 |
- Go语言time.Ticker与time.After使用差异及问题解析
- 219浏览 收藏
-
- Golang · Go教程 | 3小时前 |
- FetchDebian让你轻松搞定Debian软件包管理
- 117浏览 收藏
-
- Golang · Go教程 | 14小时前 |
- Debian上Kubernetes版本更新攻略
- 122浏览 收藏
-
- Golang · Go教程 | 15小时前 |
- MongoDB存储空间优化技巧大全
- 153浏览 收藏
-
- Golang · Go教程 | 1天前 |
- Debian系统生成CPUInfo详细教程
- 170浏览 收藏
-
- Golang · Go教程 | 1天前 |
- Debian系统OpenSSL版本更新攻略
- 253浏览 收藏
-
- Golang · Go教程 | 1天前 |
- Debian上Rust开发推荐的IDE
- 147浏览 收藏
-
- Golang · Go教程 | 1天前 |
- Go语言切片与数组使用易混淆问题详解
- 474浏览 收藏
-
- Golang · Go教程 | 1天前 |
- Debian上Golang并发处理实用技巧
- 331浏览 收藏
-
- Golang · Go教程 | 1天前 |
- DebianFTPServer如何限制并发连接数
- 470浏览 收藏
-
- Golang · Go教程 | 1天前 |
- Rust在Debian上的环境配置指南
- 393浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 魔匠AI
- SEO摘要魔匠AI专注于高质量AI学术写作,已稳定运行6年。提供无限改稿、选题优化、大纲生成、多语言支持、真实参考文献、数据图表生成、查重降重等全流程服务,确保论文质量与隐私安全。适用于专科、本科、硕士学生及研究者,满足多语言学术需求。
- 19次使用
-
- PPTFake答辩PPT生成器
- PPTFake答辩PPT生成器,专为答辩准备设计,极致高效生成PPT与自述稿。智能解析内容,提供多样模板,数据可视化,贴心配套服务,灵活自主编辑,降低制作门槛,适用于各类答辩场景。
- 34次使用
-
- Lovart
- SEO摘要探索Lovart AI,这款专注于设计领域的AI智能体,通过多模态模型集成和智能任务拆解,实现全链路设计自动化。无论是品牌全案设计、广告与视频制作,还是文创内容创作,Lovart AI都能满足您的需求,提升设计效率,降低成本。
- 35次使用
-
- 美图AI抠图
- 美图AI抠图,依托CVPR 2024竞赛亚军技术,提供顶尖的图像处理解决方案。适用于证件照、商品、毛发等多场景,支持批量处理,3秒出图,零PS基础也能轻松操作,满足个人与商业需求。
- 42次使用
-
- PetGPT
- SEO摘要PetGPT 是一款基于 Python 和 PyQt 开发的智能桌面宠物程序,集成了 OpenAI 的 GPT 模型,提供上下文感知对话和主动聊天功能。用户可高度自定义宠物的外观和行为,支持插件热更新和二次开发。适用于需要陪伴和效率辅助的办公族、学生及 AI 技术爱好者。
- 44次使用
-
- Go time包AddDate使用解惑实例详解
- 2023-01-11 164浏览
-
- golang包循环引用的几种解决方案总结
- 2023-01-07 208浏览
-
- Golang template 包基本原理分析
- 2022-12-31 500浏览
-
- GO中sync包自由控制并发示例详解
- 2023-01-07 391浏览
-
- 一文详解Golang中net/http包的实现原理
- 2022-12-29 419浏览