标签 go.mod 下的文章

Go,13周年[译]

本文永久链接 – https://tonybai.com/2022/11/11/go-opensource-13-years

在中华大地的老百姓抱着手机进行双十一购物节狂欢,忙着支付尾款和秒杀的时候,Go核心团队的Russ Cox代表Go语言项目团队在Go官博上发表了《Thirteen Years of Go》的博文,纪念Go语言开源13周年,并对2021年以来Go语言的演进进行了归纳总结,对Go在其第14个年头将要做的改进也做了简单的说明。这里对博文做简单翻译,供大家参考。


今天,我们庆祝Go开源版本的十三岁生日。从今天起,Go将正式步入青少年阶段

译注:teenager:青少年;13岁到19岁的年轻人

对于Go来说,过去的一年是不平凡的一年。在这一年里发生的最重要的事件是Go 1.18版本在3月份的发布,这个版本带来了许多改进,其中最显着的是Go工作区模糊测试Go泛型

Go工作区使得同时处理多个module变得容易,尤其是当你维护一组彼此有依赖关系的module时。若要了解Go工作区,请参阅Beth Brown的博客文章“熟悉工作区”工作区参考文档

模糊测试(Fuzzing)是一个新功能特性,它可以帮助你查找出代码无法正确处理的输入。你只需定义一个接受任何输入数据的模糊测试,然后模糊测试会尝试不同的随机输入,这个过程由代码覆盖率指导,并努力尝试使模糊测试执行失败。在开发对任意输入(甚至是攻击者控制的输入)具有鲁棒性的代码时,模糊测试尤其有用。若要了解有关模糊测试的详细信息,请参阅教程“模糊测试入门”模糊测试参考文档,并留意凯蒂·霍克曼(Katie Hockman)在GopherCon 2022上的演讲“Fuzzing Test made Easy”,这个演进的视频应该很快就会上线的。

泛型,很可能是Go开发者最需要的功能特性(译注:来自Go官方调查数据),它在Go中增加了参数多态性机制,以支持编写可适配各种不同类型的代码,并且仍不会失去编译时静态检查的保证。要了解有关泛型的更多信息,请参阅教程“泛型入门”。更多详细信息,请参阅博客文章《泛型简介》“何时使用泛型”,或是来自Go Day 2021年谷歌开源直播“在Go中使用泛型”以及来自GopherCon 2021由Robert Griesemer和Ian Lance Taylor共同的演讲“Generics”

与Go 1.18版本相比,今年8月份发布的Go 1.19版本显得有些波澜不惊,这与该版本专注于完善和改进Go 1.18引入的功能特性以及内部稳定性改进和优化不无关系。Go 1.19的一个明显变化是增加了支持Go文档注释中的链接、列表和标题。另一个则是为垃圾回收器添加了软内存限制(soft memory limit),这在容器工作负载中特别有用。有关最近的垃圾回收器改进的更多信息,参见Michael Knyszek的博客文章“Go Runtime:4 Years later”、他的演讲“Respecting Memory Limits in Go” 以及新的“Go垃圾收集器指南”

我们一直努力让Go代码开发可以更优雅的扩展,支持更大规模的代码库,我们在VS Code Go和Gopls语言服务器上的工作就致力于此。今年,Gopls的工作聚焦于提高稳定性和性能,同时提供了对泛型以及新的代码分析的支持。如果你还没有使用VS Code Go或Gopls,不妨尝试一下。可以看看苏茜·穆勒(Suzy Mueller)的演讲“使用Go编辑器构建更好的项目”。 作为奖励,在VS Code 中调试Go通过Delve原生对调试适配器协议(Debug Adapter Protocol)支持而变得更加可靠和强大。最后试试苏茜的《调试寻宝记》吧!

开发规模的另一部分是项目中依赖项的数量。Go 12岁生日后的一个月左右,Log4shell漏洞的出现为行业敲响警钟,关于供应链安全的重要性得以提升。Go的module系统是专门为此而设计的,帮助您了解和跟踪依赖项,确定您正在使用哪些特定的依赖,并确定其中是否有任何已知漏洞。菲利波·瓦尔索达的博客文章“如何缓解供应链攻击” 概述了我们的方法。9月,我们通过Julie Qiu的博客文章“Vulnerability Management for Go”发布了Go漏洞管理方法预览版,这项工作的核心是一个新的、精心策划的漏洞数据库 和一个新的govulncheck命令,它使用高级静态分析来消除大多数误报。

我们为了了解Go用户而付出的努力之一是我们的年度Go年终调查。今年,我们的用户体验研究人员还增加了一个轻量级的年中Go调查。我们的目标是收集足够的回复,使其具有统计意义,而这也不会成为整个Go社区的负担。有关结果,请参阅Alice Merrick的博客文章“Go开发者调查2021年结果”和托德·库列萨的文章“Go开发者调查2022 年第二季度结果”

随着世界开始恢复更多地旅行,我们也很高兴在2022年的Go技术会议上亲自见到你们中的许多人,特别是7月在柏林举行的GopherCon欧洲大会和10月在芝加哥举行的GopherCon。上周,我们在谷歌开源直播上举办了一年一度的虚拟活动Go Day。 以下是我们在这些活动上的一些演讲:

今年的另一个里程碑是出版了“Go编程语言和环境”, 作者是Russ Cox、Robert Griesemer、Rob Pike、Ian Lance Taylor和Ken Thompson,文章发表在“ACM通信”中。 这篇文章,由Go的原始设计者和实现者解释了我们认为是什么让Go如此受欢迎和富有成效。 简而言之,Go 的工作重点是提供完整的开发环境。针对整个软件开发过程,重点是扩展到大型软件工程工作和大型部署。

在Go的第14个年头,我们将继续努力使Go成为用于大规模软件工程的最好的环境。我们计划特别关注供应链安全,提高兼容性和结构化日志记录,所有这些都已在这篇文章中有链接。当然还会有很多其他改进,包括profile-guided optimization等。

谢谢!Go一直远远超过Google的Go团队所做的。感谢你们所有人——我们的贡献者和Go社区中的每个人——感谢您的帮助使Go成为今天的成功编程环境。我们祝愿你在来年一切顺利。


“Gopher部落”知识星球旨在打造一个精品Go学习和进阶社群!高品质首发Go技术文章,“三天”首发阅读权,每年两期Go语言发展现状分析,每天提前1小时阅读到新鲜的Gopher日报,网课、技术专栏、图书内容前瞻,六小时内必答保证等满足你关于Go语言生态的所有需求!2022年,Gopher部落全面改版,将持续分享Go语言与Go应用领域的知识、技巧与实践,并增加诸多互动形式。欢迎大家加入!

img{512x368}
img{512x368}

img{512x368}
img{512x368}

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格5$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

Gopher Daily(Gopher每日新闻)归档仓库 – https://github.com/bigwhite/gopherdaily

我的联系方式:

  • 微博(暂不可用):https://weibo.com/bigwhite20xx
  • 微博2:https://weibo.com/u/6484441286
  • 博客:tonybai.com
  • github: https://github.com/bigwhite

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

Go标准库依赖的那些modules

本文永久链接 – https://tonybai.com/2022/10/25/the-modules-that-go-standard-library-depend-on

对于程序员来说,编写的代码依赖标准库是“天经地义”的事情。标准库在程序员眼中就是高质量的代名词,也是最值得信赖的非自己所写的代码,当然更是代码包依赖关系链条上的最后一环,即所有直接或间接依赖的第三方module最终都会依赖标准库。

前两天组内学习rust的小伙伴说rust的标准库还依赖第三方库(注:我对rust了解不深,尚未证实),这引发了我的一个疑问: Go标准库是否依赖其他modules呢?在这一短篇中,我就来探究一下

注:本文使用的Go版本为Go 1.19


众所周知,Go于1.11版本引入go modules,如今Go module已经完全替代掉原先的gopath构建模式,成为了Go源码的标准构建模式。

相应的,Go标准库也在Go 1.13版本中采用了Go module构建,加入了go.mod文件,第一版标准库的go.mod文件内容如下:

module std

go 1.12

require (
    golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8
    golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7
    golang.org/x/sys v0.0.0-20190529130038-5219a1e1c5f8 // indirect
    golang.org/x/text v0.3.2 // indirect
)

我们看到Go标准库的module path为std。不过就像开篇说的那样,很多gopher认为标准库应该是依赖链的末端,但从go.mod文件的内容来看,Go标准库也有自己的依赖

我们再来看看Go 1.19版本中go.mod的内容:

module std

go 1.19

require (
    golang.org/x/crypto v0.0.0-20220516162934-403b01795ae8
    golang.org/x/net v0.0.0-20220517181318-183a9ca12b87
)

require (
    golang.org/x/sys v0.0.0-20220614162138-6c1b26c55098 // indirect
    golang.org/x/text v0.3.8-0.20220509174342-b4bca84b0361 // indirect
)

我们看到:和Go 1.13版本相比,Go标准库的go.mod将直接依赖和间接依赖(也叫传递依赖)分开放在不同的require block中,这是因为Go 1.17版本增加的module依赖图修剪特性

但从Go标准库依赖的modules来看,和Go 1.13相比,Go标准库依赖的modules并没有变化。

Go标准库依赖的是什么modules呢?我们看到其依赖的module都在golang.org/x这个路径下,这是Go核心团队自己维护的非标准库module的Canonical import paths的前缀路径。golang.org/x这个前缀路径下的包有不少,如下图所示:

其中,主要的可以被import的功能module包括:

  • crypto:额外的密码学软件包
  • image:额外的图像处理包
  • net:额外的网络相关处理包
  • sync:额外的并发同步原语包
  • sys:用于进行系统调用的软件包
  • text:用于处理文本的软件包
  • time:额外的时间处理相关包
  • exp:实验性(experimental)的和废弃的(deprecated)软件包

注:exp下面的包尽量不用,或务必谨慎使用,这里实验性包居多,API接口和具体实现变化可能性很大。还有一些是废弃不再维护的。

那Go标准库为什么会直接依赖crypto和net这两个modules呢?

我的理解是网络与密码学是两个变化较快的领域,同时也是两个十分重要的领域,尤其是在如今对安全十分重视的云原生时代。一些新的密码学算法、网络技术规范(RFC)在不断的出现并持续演进,这些技术在未成熟前尚不适合放入标准库,那么在标准库之外由Go核心团队维护一个“与时俱进”的库就十分必要。等成熟后,在标准库中设计并提供稳定接口并引用golang.org/x/abc下的实现就可以很快实现对某成熟网络技术或密码学技术的稳定支持,当年Go 1.6版本对http/2的支持就是这么做的

那么Go标准库都依赖了哪些具体的包了呢?我们可以看一下\$GOROOT/src/vendor下面的modules.txt:

# golang.org/x/crypto v0.0.0-20220516162934-403b01795ae8
## explicit; go 1.17
golang.org/x/crypto/chacha20
golang.org/x/crypto/chacha20poly1305
golang.org/x/crypto/cryptobyte
golang.org/x/crypto/cryptobyte/asn1
golang.org/x/crypto/curve25519
golang.org/x/crypto/curve25519/internal/field
golang.org/x/crypto/hkdf
golang.org/x/crypto/internal/poly1305
golang.org/x/crypto/internal/subtle
# golang.org/x/net v0.0.0-20220517181318-183a9ca12b87
## explicit; go 1.17
golang.org/x/net/dns/dnsmessage
golang.org/x/net/http/httpguts
golang.org/x/net/http/httpproxy
golang.org/x/net/http2/hpack
golang.org/x/net/idna
golang.org/x/net/lif
golang.org/x/net/nettest
golang.org/x/net/route
# golang.org/x/sys v0.0.0-20220614162138-6c1b26c55098
## explicit; go 1.17
golang.org/x/sys/cpu
# golang.org/x/text v0.3.8-0.20220509174342-b4bca84b0361
## explicit; go 1.17
golang.org/x/text/secure/bidirule
golang.org/x/text/transform
golang.org/x/text/unicode/bidi
golang.org/x/text/unicode/norm

modules.txt是go mod vendor命令生成的,也是项目依赖包的完全列表,包括间接依赖的包。

我们可以通过go mod why命令查询为什么标准库要依赖这些module以及package,以golang.org/x/crypto这个module为例:

$go mod why -m golang.org/x/crypto
# golang.org/x/crypto
crypto/tls
golang.org/x/crypto/chacha20poly1305

我们看到是crypto/tls包依赖了golang.org/x/crypto这个module,但why只会输出标准库中依赖x/crypto module的一个包而已,并非全部。同理我们也可以查看modules.txt某个具体的包为何要被依赖,以golang.org/x/net/dns/dnsmessage为例:

$go mod why golang.org/x/net/dns/dnsmessage
# golang.org/x/net/dns/dnsmessage
net
golang.org/x/net/dns/dnsmessage

我们看到net包依赖了dnsmessage这个包。

综上,我们知道了Go标准库也是会依赖的,但其依赖的module被严格限制在Go核心团队自己维护的golang.org/x下面的少数module,因此我们依然可以完全信任Go标准库,相信后续Go标准库也会一直保证实现的高质量。


“Gopher部落”知识星球旨在打造一个精品Go学习和进阶社群!高品质首发Go技术文章,“三天”首发阅读权,每年两期Go语言发展现状分析,每天提前1小时阅读到新鲜的Gopher日报,网课、技术专栏、图书内容前瞻,六小时内必答保证等满足你关于Go语言生态的所有需求!2022年,Gopher部落全面改版,将持续分享Go语言与Go应用领域的知识、技巧与实践,并增加诸多互动形式。欢迎大家加入!

img{512x368}
img{512x368}

img{512x368}
img{512x368}

我爱发短信:企业级短信平台定制开发专家 https://tonybai.com/。smspush : 可部署在企业内部的定制化短信平台,三网覆盖,不惧大并发接入,可定制扩展; 短信内容你来定,不再受约束, 接口丰富,支持长短信,签名可选。2020年4月8日,中国三大电信运营商联合发布《5G消息白皮书》,51短信平台也会全新升级到“51商用消息平台”,全面支持5G RCS消息。

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格5$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

Gopher Daily(Gopher每日新闻)归档仓库 – https://github.com/bigwhite/gopherdaily

我的联系方式:

  • 微博:https://weibo.com/bigwhite20xx
  • 博客:tonybai.com
  • github: https://github.com/bigwhite

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 AI原生开发工作流实战 从 0 开始构建 Agent Harness Go语言精进之路1 Go语言精进之路2 Go语言第一课 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com
这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats