帝游网提供最新手游APP下载和游戏攻略!

深入解析:Go 1.16版本关键更新及适配指南

发布时间:2025 07 19 22:23:56浏览:34

今天给各位分享深入解析:Go 1.16版本关键更新及适配指南的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

让我们看一个实际的例子。

01 安装 Delve 的例子

我们在本地通过源码安装 Go 的调试器 Delve,可以这么做:

nbsp;gogetgithub.com/go-delve/delve/cmd/dlv

因为 go get 会下载、编译并安装包(如果有 main 包)。

Go 1.16 建议这么使用 go get:

nbsp;goget-dgithub.com/go-delve/delve/cmd/dlv

这只会下载 delve,并不会构建和安装,而且将来 go get 只会用来下载。因此,你还需要手动执行安装。

02 go install 的变化

GOPATH 年代

早在 GOPATH 年代,go install 的作用如下:

Installcompilesandinstallsthepackagesnamedbytheimportpaths.The-iflaginstallsthedependenciesofthenamedpackagesaswell.

也就是说,go install 会将包编译成 .a 文件并安装到 $GOPATH/pkg/$GOOS_$GOARCH 下;如果是 main 包,会编译并生成可执行文件安装到 $GOPATH/bin 目录下(如果设置了 $GOBIN,则会安装到 $GOBIN 下 )。这也是和 go build 不同之处。

Go Module 年代

到了 Go Module 年代,情况发生了变化。大家似乎完全忘记了 go install 的存在(也有可能在 GOPATH 年代,大家就从来不用 go install),因为 go get、go build 就解决问题了。

特别是,从 Go Module 开始,工作目录没有了 src/pkg/bin 这三个目录,使得 go build 比 go install 更受欢迎。(GOPATH 年代,我更喜欢 go install,因为它会在项目生成和 GOROOT 一样的 src/pkg/bin,保持一致)。

看看 Module 年代,go install 命令的作用:(基于 Go1.15.x)

Installcompilesandinstallsthepackagesnamedbytheimportpaths.ExecutablesareinstalledinthedirectorynamedbytheGOBINenvironmentvariable,whichdefaultsto$GOPATH/binor$HOME/go/biniftheGOPATHenvironmentvariableisnotset.Executablesin$GOROOTareinstalledin$GOROOT/binor$GOTOOLDIRinsteadof$GOBIN.Whenmodule-awaremodeisdisabled,otherpackagesareinstalledinthedirectory$GOPATH/pkg/$GOOS_$GOARCH.Whenmodule-awaremodeisenabled,otherpackagesarebuiltandcachedbutnotinstalled.The-iflaginstallsthedependenciesofthenamedpackagesaswell.

Module 没启用时,和 GOPATH 年代的作用是一样的。当启用 Module 模式时,go install 对普通包(非 main 包)不再安装(即没有了 pkg/$GOOS_$GOARCH),这和 go build 一样了。而对于 main 包,会将生成的可执行文件安装到 $GOBIN 目录下($GOBIN 的默认值是 $GOPATH/bin,如果 $GOPATH 没有设置,则是 $HOME/go/bin)。

那么,Module 模式下,什么情况下你可能会使用 go install 呢?

如果你有这样的习惯会使用 go install。

$GOBIN 在 PATH 环境变量下,这样,GOBIN 下面的可执行文件可以方便的运行。比如你的工作 module 是:github.com/polaris1119/test ,可以通过 go install github.com/polaris1119/test 将 test 安装到 GOBIN 下,然后直接执行 test 运行。

Go 1.16 及以后

从 Go 1.16 起,go install 可以接受带有版本后缀的参数(例如 go install example.com/cmd@v1.0.0)。这将导致 go install 以模块感知模式构建和安装包,而忽略当前目录或任何父目录(如果有)中的 go.mod 文件。这对于在不影响主模块依赖性的情况下安装可执行文件很有用。

所以,Go 1.16 及以后,go get 和 go install 应该什么时候使用呢?

  • 如果要安装第三方库的可执行文件,比如上面的 Delve,使用 go install,但需要带上版本后缀,比如 @latest;(不清楚为什么设计成必须带上版本号)
  • 普通的库,继续使用 go get,建议加上 -d 标志;

注意,虽然 go install 一个普通的第三方包(不过必须带上版本后缀)也会下载对应的包,但不会修改 go.mod,这和 go get 是不同的。

03 总结

总结一下这个变化:(Go 1.16 还不会有影响,将来就会有影响,所以可以提前习惯下)

用户评论

念安я

确实需要适应一下啊,我刚试了一下,感觉语法有点不一样了,幸好官方提供了详细的升级指南,慢慢摸索着还能看懂。

    有10位网友表示赞同!

怪咖

老规矩,每次 Go 更新都有一点“吃力”,不过这次新变化倒是挺好用的,对代码可读性和维护性有提升,值得适应一下

    有16位网友表示赞同!

無極卍盜

我更担心兼容性问题,希望那些第三方库也能尽快适配新版本,要不然项目切换起来太头疼!

    有7位网友表示赞同!

箜篌引

这个 “New change” 说的好像很复杂一样,其实我觉得挺小的改变,不会影响日常开发,大家还是安心用 Go ,它永远稳固啊!

    有15位网友表示赞同!

心贝

1.16 的新变化我还没试过,不过根据官方说明来看,看起来蛮实用的,特别是那部分关于并发编程的优化,可以提高效率不少,应该好好研究一下学习。

    有19位网友表示赞同!

最迷人的危险

Go 总是保持稳定性不错,每次更新也大多是功能增强和bug修复,不会像其他语言那么频繁变幻莫测,这种风格我比较喜欢!这回新变化也好用

    有5位网友表示赞同!

半梦半醒i

我已经将 Go 用到了很多项目里了,虽然每一次升级都需要适应一下新语法和特征,但总的来说还是值得的,Go 的性能和生态越来越好!加油啊,Go!

    有13位网友表示赞同!

嗯咯

我还在旧版本的 Go 里混日子呢,听说1.16 出来了?新变化是什么样的?有详细的地方吗?

    有8位网友表示赞同!

糖果控

刚开始写 Go 时,确实不太适应这种静态类型语言的思维方式。后来越来越熟练了,现在感觉 Go 代码比其他语言清晰简洁不少,这次的新变化应该能给我带来更多开发快乐!

    有18位网友表示赞同!

余温散尽ぺ

希望这个新版本能够修复一些我之前遇到的 bug,以及提升一下性能,这样才能更顺利地开发项目。

    有9位网友表示赞同!

仰望幸福

这篇文章讲得真不错,让我对 Go 1.16 的新变化一目了然。虽然适应需要投入些时间和精力,但我还是期待着能体验到这些新功能带来的便利!

    有20位网友表示赞同!

南初

其实对于我来说,Go 最吸引人的地方就是它的简洁性和易于学习的特性。这次的新变化虽然有点调整,但我相信 Go 会继续保持住这种优势!

    有11位网友表示赞同!

爱你心口难开

以前我用过其他语言,感觉 Go 的生态环境越来越好,各个开源项目都做得相当成熟。希望这个新版本能进一步提升该优势。

    有15位网友表示赞同!

隔壁阿不都

我正在学习 Go,希望能尽快掌握它最新的特性和语法规则,这样才能更好地参与到Go 开发之中!

    有20位网友表示赞同!

夏以乔木

每次更新我都需要花些时间来研究一下新功能,不过还是觉得持续学习 Go 很重要。这次的改变应该会让我写出更优雅、更有效率的代码!

    有7位网友表示赞同!

夏日倾情

我已经升级了 Go 到1.16 版本,开始探索新特性。目前来看,一些改进确实可以提升开发效率,尤其是对于大型项目的优化措施。

    有8位网友表示赞同!

有一种中毒叫上瘾成咆哮i

不知道这个新版本会不会增加新的标准库功能呢?我希望能够看到更多对程序员友好的设计和API!

    有5位网友表示赞同!

热点资讯