Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【初识Go】| Day9 包管理

【初识Go】| Day9 包管理

原创
作者头像
yussuy
修改于 2020-12-24 02:07:11
修改于 2020-12-24 02:07:11
4930
举报

现在随便一个小程序的实现都可能包含超过10000个函数。然而作者一般只需要考虑其中很小的一部分和做很少的设计,因为绝大部分代码都是由他人编写的,它们通过类似包或模块的方式被重用。

Go语言有超过100个的标准包(译注:可以用go list std | wc -l命令查看标准包的具体数目),标准库为大多数的程序提供了必要的基础构件。在Go的社区,有很多成熟的包被设计、共享、重用和改进,目前互联网上已经发布了非常多的Go语言开源包,它们可以通过 http://godoc.org 检索。在本章,我们将演示如果使用已有的包和创建新的包。

Go还自带了工具箱,里面有很多用来简化工作区和包管理的小工具。我们已经见识过如何使用工具箱自带的工具来下载、构建和运行我们的演示程序了。在本章,我们将看看这些工具的基本设计理论和尝试更多的功能,例如打印工作区中包的文档和查询相关的元数据等。

包简介

任何包系统设计的目的都是为了简化大型程序的设计和维护工作,通过将一组相关的特性放进一个独立的单元以便于理解和更新,在每个单元更新的同时保持和程序中其它单元的相对独立性。这种模块化的特性允许每个包可以被其它的不同项目共享和重用,在项目范围内、甚至全球范围统一的分发和复用。

每个包一般都定义了一个不同的名字空间用于它内部的每个标识符的访问。每个名字空间关联到一个特定的包,让我们给类型、函数等选择简短明了的名字,这样可以在使用它们的时候减少和其它部分名字的冲突。

每个包还通过控制包内名字的可见性和是否导出来实现封装特性。通过限制包成员的可见性并隐藏包API的具体实现,将允许包的维护者在不影响外部包用户的前提下调整包的内部实现。通过限制包内变量的可见性,还可以强制用户通过某些特定函数来访问和更新内部变量,这样可以保证内部变量的一致性和并发时的互斥约束。

当我们修改了一个源文件,我们必须重新编译该源文件对应的包和所有依赖该包的其他包。即使是从头构建,Go语言编译器的编译速度也明显快于其它编译语言。Go语言的闪电般的编译速度主要得益于三个语言特性。第一点,所有导入的包必须在每个文件的开头显式声明,这样的话编译器就没有必要读取和分析整个源文件来判断包的依赖关系。第二点,禁止包的环状依赖,因为没有循环依赖,包的依赖关系形成一个有向无环图,每个包可以被独立编译,而且很可能是被并发编译。第三点,编译后包的目标文件不仅仅记录包本身的导出信息,目标文件同时还记录了包的依赖关系。因此,在编译一个包的时候,编译器只需要读取每个直接导入包的目标文件,而不需要遍历所有依赖的的文件(译注:很多都是重复的间接依赖)。

Go Modules是什么?

Go语言通过包管理来封装模块和复用代码,这里我们只介绍Go Modules管理方法

Go Modules于Go语言1.11版本时引入,在1.12版本正式支持,是由Go语言官方提供的包管理解决方案

Modules是相关Go包的集合,是源代码交换和版本控制的单元。go命令直接支持使用Modules,包括记录和解析对其他模块的依赖性

Go Modules的使用方法

环境变量

首先需要设置环境变量,可以使用go env命令查看当前配置。

代码语言:txt
AI代码解释
复制
$ go env

GO111MODULE="auto"

GOPROXY="https://proxy.golang.org,direct"

GONOPROXY=""

GOSUMDB="sum.golang.org"

GONOSUMDB=""

GOPRIVATE=""

如果需要更改 GO111MODULE ,可以使用go env命令

代码语言:txt
AI代码解释
复制
go env -w GO111MODULE=on

GO111MODULE

  • auto:只要项目包含了 go.mod 文件的话启用 Go modules,目前在 Go1.11 至 Go1.14 中仍然是默认值。
  • on:启用 Go modules,推荐设置,将会是未来版本中的默认值。
  • off:禁用 Go modules,不推荐设置。

GOPROXY

此环境变量主要用于设计Go Module的代理

GOSUMDB

此环境变量用于在拉取模块的时候保证模块版本数据的一致性。

初始化模块

Go Modules的使用方法比较灵活,在目录下包含go.mod文件即可

首先通过如下命令创建一个新的Module

代码语言:txt
AI代码解释
复制
go mod init [module name]

然后当前目录会生成go.mod文件,其内容为:

代码语言:txt
AI代码解释
复制
module ModuleName



go 1.15

Go Modules会自动管理包,如果需要引入依赖,只需要在go.mod下添加以下内容(以gorose为例子)

代码语言:txt
AI代码解释
复制
module ModuleName

 

require (

    github.com/gohouse/gorose v1.0.5

)

go get

go get 命令用于拉取新的依赖,以下为go get命令具体用法

go get

拉取依赖,会进行指定性拉取(更新),并不会更新所依赖的其它模块。

go get -u

更新现有的依赖,会强制更新它所依赖的其它全部模块,不包括自身。

go get -u -t ./...

更新所有直接依赖和间接依赖的模块版本,包括单元测试中用到的。

其他参数

代码语言:txt
AI代码解释
复制
-d 只下载不安装

-f 只有在你包含了 -u 参数的时候才有效,不让 -u 去验证 import 中的每一个都已经获取了,这对于本地 fork 的包特别有用

-fix 在获取源码之后先运行 fix,然后再去做其他的事情

-t 同时也下载需要为运行测试所需要的包

-u 强制使用网络去更新包和它的依赖包

-v 显示执行的命令

常用命令

代码语言:txt
AI代码解释
复制
go mod init  // 初始化go.mod

go mod tidy  // 更新依赖文件

go mod download  // 下载依赖文件

go mod vendor  // 将依赖转移至本地的vendor文件

go mod edit  // 手动修改依赖文件

go mod graph  // 查看现有的依赖结构

go mod verify  // 校验依赖

参考资料

http://shouce.jb51.net/gopl-zh/ch10/ch10.html

https://github.com/datawhalechina/go-talent/blob/master/8.%E5%8C%85%E7%AE%A1%E7%90%86.md(https://github.com/datawhalechina/go-talent/blob/master/8.%E5%8C%85%E7%AE%A1%E7%90%86.md)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
项目改用GoModules管理依赖的方法和经验总结
Go语言官方提供的依赖包管理工具已经发布很久了,有很多大佬的文章对Go Modules做了非常详尽的介绍,比如煎鱼大佬的: Go Modules终极入门(文章链接:https://juejin.cn/post/6844903433846145038)。
KevinYan
2020/12/15
1K0
项目改用GoModules管理依赖的方法和经验总结
腾讯云Go技术专家一文带你深入了解Go Modules的前世今生与基本使用
‍‍ 来源|云+社区公众号 作者|李保坤 2020年腾讯内部的一份开发者报告显示,Go语言已经成为腾讯内部第二大后端开发语言,在腾讯每天有大量的Go开发者在做业务和平台开发,大量的团队和项目使用也暴露出一些问题,随着Go Modules的出现,类似于内部自签发证书、安全审计等这些问题也逐渐得到解决。 笔者在腾讯当前负责腾讯云在Go编程语言使用上的一些问题,2021年初开始负责内部goproxy服务并推广Go Modules使用,这些技术支撑了腾讯云、微信、腾讯视频、腾讯游戏、腾讯音乐、腾讯会议
腾源会
2021/12/01
7330
Go Modules:Go语言依赖管理的新篇章
自从Go 1.11版本引入以来,Go Modules 已经成为了Go语言依赖管理的标准。接下来,我将用简单易懂的语言,带你一步步了解Go Modules的安装、使用和最佳实践。
南山竹
2024/06/06
4240
Go Modules:Go语言依赖管理的新篇章
[系列] - 使用 go modules 包管理工具(一)
我想实现一个开箱即用的 API 框架的轮子,这个轮子是基于 Gin 基础上开发的。
新亮
2019/08/28
7560
[系列] - 使用 go modules 包管理工具(一)
浅谈GoPath和Go Modules包管理
从v1.5开始开始引入vendor模式,如果项目目录下有vendor目录,那么go工具链会优先使用vendor内的包进行编译、测试等
仙人技术
2021/08/31
1.2K0
浅谈GoPath和Go Modules包管理
go包管理速通,一篇文章就够了
最近在看一些go语言相关的书,发现了一个有意思的事情:其中一本书最新印刷的版本是2017年3月,而golang包管理的后起之秀 gomodule伴随go1.11于2018年8月诞生——因此,书里没有。
白泽z
2022/08/18
5050
go包管理速通,一篇文章就够了
go语言项目及其配置
$ go mod init pkslow.com/pkslow_test go: creating new go.mod: module pkslow.com/pkslow_test
h3110_w0r1d
2024/02/19
1460
go语言项目及其配置
Go两周入门系列-包管理
实际项目总要依赖各种第三发开发包,各类开发语言都有自己的第三方包依赖管理工具,例如:java的maven、js的npm、php的composer等,golang在1.11版本以前官方是没有提供包依赖管理工具的,只有一些社区提供的工具,从1.11版本以后官方就提供mod模块管理工具。
用户10002156
2023/10/04
3250
Go两周入门系列-包管理
官方golang包管理神器,值得一试!
我们上次说过如何让一个项目在 Goland 编译器跑起来,但是要自己去下包,要花不少时间找包下包,是不是很麻烦?
机智的程序员小熊
2020/05/20
2.6K0
Go | 浅谈包管理模式
go的编译器会在 $GOPATH/src 下面寻找对应的模块,src 下的每一个目录都可以对应一个模块,目录中的目录也可以是一个模块
甜点cc
2022/11/16
5320
Go | 浅谈包管理模式
go-环境配置
二者区别: go build 将相关依赖库一起打包,可以在任意机器运行,go run 需要go环境支持
用户10325771
2023/03/01
3600
Go Modules 终极入门
Go modules 是 Go 语言中正式官宣的项目依赖解决方案,Go modules(前身为vgo)于 Go1.11 正式发布,在 Go1.14 已经准备好,并且可以用在生产上(ready for production)了,Go 官方也鼓励所有用户从其他依赖项管理工具迁移到 Go modules。
madneal
2020/03/10
1.9K0
Go Modules 终极入门
Golang中的包管理工具 - Go Modules
在Go1.5之前使用GOROOT和GOPATH这2个系统环境变量来决定包的位置,对于开发者主要使用GOPATH。GOPATH 解决了第三方源码依赖的问题,看一下我本机 $GOPATH/src 下的目录:
猿哥
2019/08/01
1.6K0
Go Module详细使用教程,包管理不在难
go modules是 golang 1.11引入的新特性。模块是相关Go包的集合。modules是源代码交换和版本控制的单元。go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。
公号:咻咻ing
2020/03/04
20.6K0
Go的包管理工具(三):Go Modules
在前面的文章,我们先是介绍了Go 的几种包管理方式,然后具体介绍了一种包管理的工具:glide。随着 Go 1.11 的发布,官方的包管理工具 Go Modules 变得流行起来。在发布不久的 Go 1.12 版本中,增强了对 Go Modules 的支持。本文将会介绍如何在项目中安装和使用 Go Modules 。
aoho求索
2019/05/07
1.5K0
GoLand激活码2022(2022Goland最新激活码)
KLMILO9UY9-eyJsaWNlbnNlSWQiOiJHT1VHRExEVVVGIiwibGljZW5zZWVOYW1lIjoi5rC45LmF5r+A5rS7IHd3d8K3YWppaHVvwrdjb20iLCJhc3NpZ25lZU5hbWUiOiIiLCJhc3NpZ25lZUVtYWlsIjoiIiwibGljZW5zZVJlc3RyaWN0aW9uIjoiIiwiY2hlY2tDb25jdXJyZW50VXNlIjpmYWxzZSwicHJvZHVjdHMiOlt7ImNvZGUiOiJQQyIsInBhaWRVcFRvIjoiMjAyMi0xMC0yMiIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUFBDIiwicGFpZFVwVG8iOiIyMDIyLTEwLTIyIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBXUyIsInBhaWRVcFRvIjoiY1dsGw9l2T8ENH3LSXOLgQZerqGL9O8MKw4n0Tx0da3f73PUo6yjRKxr3AVkwYUiW5VLXpF2nWIPSk+6Wd7Zyq31RTFbZTrY/OJE8++zXHj9biJG8mcCOnEwTgOZYgwEUzjjLw27Dkl9gq5vBcYEo1F4lr/lWSc6wlzCY48Syvoni9xAE9cFHDkUHNA7muTetqLem8QxHEtaHenbwBhdA803AIpGLYnZ0kMwjPWNzEx+Awc768oxZ6BoFvKtOqe3fW5jlL0yCIGYz/RE9RixVK7TBNVBFxm/PLOWLYlQytw5ECk3EqwDoszcoqMYAYZXaT45yopeQ==-MIIETDCCAjSgAwIBAMjAyMi0xMC0yMiIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQU0kiLCJwYWlkVXBUbyI6IjIwMjItMTAtMjIiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUENXTVAiLCJwYWlkVXBUbyI6IjIwMjItMTAtMjIiLCJleHRlbmRlZCI6dHJ1ZX1dLCJtZXRhZGF0YSI6IjAxMjAyMjA5MjNQU0FNMDAwMDA1IiwiaGFzaCI6IjM4MTM3NzQ2LzA6LTg5OTkzNTkwOCIsImdyYWNlUGVyaW9kRGF5cyI6NywiYXV0b1Byb2xvbmdhdGVkIjpmYWxzZSwiaXNBdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlfQ==-kqXUG+MjwwlLjgIBDTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTIwMTAxOTA5MDU1M1oXDTIyMTAyMTA5MDU1M1owHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyMDEwMTkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDCP4uk4SlVdA5nuA3DQC+NsEnZS9npFnO0zrmMWcz1++q2UWJNuGTh0rwi+3fUJIArfvVh7gNtIp93rxjtrQAuf4/Fa6sySp4c32MeFACfC0q+oUoWebhOIaYTYUxm4LAZ355vzt8YeDPmvWKxA81udqEk4gU9NNAOz1Um5/8LyR8SGsSc4EDBRSjcMWMwMkYSauGqGcEUK8WhfplsyF61lKSOFA6VmfUmeDK15rUWWLbOMKgn2cxFA98A+s74T9Oo96CU7rp/umDXvhnyhAXSukw/qCGOVhwKR8B6aeDtoBWQgjnvMtPgOUPRTPkPGbwPwwDkvAHYiuKJ7Bd2wH7rAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQUJNoRIpb1hUHAk0foMSNM9MCEAv8wSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBAB2J1ysRudbkqmkUFK8xqhiZaYPd30TlmCmSAaGJ0eBpvkVeqA2jGYhAQRqFiAlFC63JKvWvRZO1iRuWCEfUMkdqQ9VQPXziE/BlsOIgrL6RlJfuFcEZ8TK
PyCharm-superman
2022/12/12
8.5K39
GoLand激活码2022(2022Goland最新激活码)
go的包管理
go没有命名空间的概念,只有包的概念,每个目录下的package名需要一致,但是不需要跟所在目录名相同:
仙士可
2022/01/18
7280
go的包管理
Go Modules知识点总结
起初Go语言在1.5之前没有依赖管理工具,若想引入依赖库,需要执行go get命令将代码拉取放入GOPATH/src目录下,作为GOPATH下的全局依赖,这也就意味着没有版本控制及隔离项目的包依赖;
Golang梦工厂
2023/02/26
8610
Go Modules知识点总结
Go语言笔记----GoMoudle
将你的包或者别人的包全部放在 $GOPATH/src 目录下进行管理的方式,我们称之为 GOPATH 模式。
大忽悠爱学习
2022/05/10
6040
Go语言笔记----GoMoudle
go env 命令详解
默认情况下 go env 输出格式为 Shell 脚本格式(如 Windows 上是 batch 文件格式)。如果指定变量名称,则只输出变量的值。
恋喵大鲤鱼
2024/03/29
2.6K0
相关推荐
项目改用GoModules管理依赖的方法和经验总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档