Go1.16 即将正式发布,以下变更你需要知道

Wesley13
• 阅读 561

大家好,我是正在沉迷学习煎鱼的煎鱼。

在前几天,Go1.16rc1 抢先发布了。结合常规的 28 发布规律,其将会在 2021.02 月份左右发布正式版本。

Go1.16 即将正式发布,以下变更你需要知道

这次 Go1.16 也带来了一些新特性或变更。那么作为一个 Gopher,想必不能错过这次的更新。

Go1.16 即将正式发布,以下变更你需要知道

今天这篇文章将会带大家了解一下 Go1.16 的几个需要关注的特性。

废弃 io/ioutil

Go 官方认为 io/ioutil 这个包的定义不明确且难以理解。所以 Russ Cox 在 2020.10.17 提出了废弃 io/ioutil 的提案。

大致变更如下:

  • Discard => io.Discard

  • NopCloser => io.NopCloser

  • ReadAll => io.ReadAll

  • ReadDir => os.ReadDir

  • ReadFile => os.ReadFile

  • TempDir => os.MkdirTemp

  • TempFile => os.CreateTemp

  • WriteFile => os.WriteFile

与此同时大家也不需要担心存在破坏性变更,因为有 Go1 兼容性的保证,在 Go1 中 io/ioutil 还会存在,只变更内部的方法调用:

`func ReadAll(r io.Reader) ([]byte, error) {
    return io.ReadAll(r)
}

func ReadFile(filename string) ([]byte, error) {
    return os.ReadFile(filename)
}
`

大家在后续也可以改改调用习惯。

支持静态资源嵌入

如果我们希望把静态文件编译进 Go 的二进制文件的话,在以往需要借助 go-bindata/go-bindata 这类第三方开源库来实现。

而从 Go1.16 起,通过 go:embed 就可以快速实现这个功能:

`import _ "embed"

//go:embed hello.txt
var s string
print(s)
`

通过对变量 s 声明 go:embed 指令,使其在编译时读取当前目录下的 hello.txt 文件。

最终变量 s 就会输出 hello.txt 文件中的字符串内容。

新增 io/fs 的支持

新增了标准库 io/fs,正式将文件系统相关的基础接口抽象到了该标准库中。

以前的话大多是在 os 标准库中,这一步抽离更进一步的抽象了文件树的接口。在后续的版本中,大家可以优先考虑使用 io/fs 标准库。

调整切片扩容策略

Go1.16 以前的 slice 的扩容条件是 len,在最新的代码中,已经改为了以 cap 属性作为基准:

  // src/runtime/slice.go if cap > doublecap {  newcap = cap } else {  // 这是以前的代码:if old.len < 1024 {  // 下面是 Go1.16rc1 的代码  if old.cap < 1024 {   newcap = doublecap  }

以官方的 test case 为例:

func main() { const N = 1024 var a [N]int x := cap(append(a[:N-1:N], 9, 9)) y := cap(append(a[:N:N], 9)) println(cap(x), cap(y))}

在 Go1.16 以前输出 2048, 1280。在 Go1.16 及以后输出 1280, 1280,保证了两种的一致。

支持 Apple Silicon M1

众所周知,最新版本的 Mac 采用了新的 64 位 ARM 架构,因此在 Go1.16 后正式支持了 GOOS=darwinGOARCH=arm64

而相应的先前用于 iOS 端口的,将改为 GOOS=iosGOARCH=arm64

同时 Apple M1 能不能很好的跑好 Go 语言程序也是各大微信群爱讨论的问题,在 GoLand 上:

Go1.16 即将正式发布,以下变更你需要知道

图来自网络,路过微信群看见

需要注意,GoLand 的一些与 Go1.16 相关的特性要到后续新版本才可以使用。

调整 Go modules 策略

从 Go1.16 起,Go modules 的环境变量 GO111MODULE默认开关将为 on,不再是之前是 auto 了。

还在使用 GOPATH,或 Go modules 没切全的同学这一块需要特别注意。

新增 GODEBUG inittrace

GODEBUG 新增 inittrace 指令,可以用于 init 方法的排查:

$ GODEBUG=inittrace=1 go run main.go

输出结果:

init internal/bytealg @0.008 ms, 0 ms clock, 0 bytes, 0 allocs init runtime @0.059 ms, 0.026 ms clock, 0 bytes, 0 allocs init math @0.19 ms, 0.001 ms clock, 0 bytes, 0 allocs init errors @0.22 ms, 0.004 ms clock, 0 bytes, 0 allocs init strconv @0.24 ms, 0.002 ms clock, 32 bytes, 2 allocs init sync @0.28 ms, 0.003 ms clock, 16 bytes, 1 allocs init unicode @0.44 ms, 0.11 ms clock, 23328 bytes, 24 allocs ...

主要作用是 init 函数跟踪的支持,以用于 init 调试和启动时间的概要分析,算是一个 GODEBUG 的补充功能点。

简化结构体标签

在 Go 语言的结构体中,我们常常会因为各种库的诉求,需要对结构体的 tag 设置标识。

如果像是以前,量比较多就会变成:

type MyStruct struct {   Field1 string `json:"field_1,omitempty" bson:"field_1,omitempty" xml:"field_1,omitempty" form:"field_1,omitempty" other:"value"` }

但在 Go1.16 及以后,就可以通过合并的方式:

type MyStruct struct {   Field1 string `json,bson,xml,form:"field_1,omitempty" other:"value"` }

方便和简洁了不少。

总结

在本次 Go1.16 中带来了不少小优化和新的特性支持。离 Go1.18 的泛型又近了一步。

另外在本次新版本中,像是 template 支持跨行:

{{"hello" |    printf}}

又或是 Linux 的默认内存管理策略下又从 MADV_FREE 改回了 MADV_DONTNEED 策略,大家在新版本中不再需要设置:

GODEBUG=madvdontneed=1

大家若有需求都可以进一步去了解,现在新版本的功能特性已经锁定,基本尘埃落定。

传送门:https://tip.golang.org/doc/go1.16。


分享 Go 语言、微服务和奇怪的系统设计

Go1.16 即将正式发布,以下变更你需要知道

👆 长按关注煎鱼,在知识的海洋里遨游

学习资料分享,关注公众号回复指令:

  • 回复【000】,下载 LeetCode 题解大全。

  • 回复【001】,下载 Go 进阶图书 Mastering Go。

本文分享自微信公众号 - 晋级CTO(up_cto)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
M1 Mac使用原生Go与开发环境
Go1.16版将正式支持AppleSilicon M1芯片,即arm64架构的Mac操作系统,目前go1.16版版本为beta1,只是会在这个基础上再修修bug,改进文档等。目前有两种方式抢先体验Go1.16:方式一:编译源代码mac上需要确保安装有rosetta2(https://support.apple.com/
Easter79 Easter79
3年前
TypeScript 核心概念梳理
!(https://oscimg.oschina.net/oscnet/02343aa5c473479185ea31a0b3d37fa7.gif)8月20日,TypeScript4.0正式发布了( AnnouncingTypeScript4.0 ),虽然没有重大的变更和特性,可以看做是3.9版本正常迭代,不过Dan
Wesley13 Wesley13
3年前
JDK15正式发布,新增功能预览!
!(https://oscimg.oschina.net/oscnet/6bd2a6635f22440998d62c58d1c4a7ad.jpg)作者|王磊来源|Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG\_Stone)JDK15在2020年9月15号正式发布了,这次发布的主
Wesley13 Wesley13
3年前
Java 12 新特性概述
Java12已如期于3月19日正式发布,此次更新是Java11这一长期支持版本发布之后的一次常规更新,截至目前,Java半年为发布周期,并且不会跳票承诺的发布模式,已经成功运行一年多了。通过这样的方式,Java开发团队能够将一些重要特性尽早的合并到JavaRelease版本中,以便快速得到开发者的反馈,避免出现类似Java9
Wesley13 Wesley13
3年前
Java 13 新特性及实战案例
近期Java界好消息频传。先是Java13发布,接着Eclipse也发布了新版本表示支持新版本的Java特性。本文介绍了Java13的新特性并展示了相关的示例。2019年9月17日,Java13正式发布。特性如下。Java13新特性此版本带来了以下几大新特性:JEP350,Dy
Stella981 Stella981
3年前
Go 1.16新功能特性不完全前瞻
Go1.16将于2021年2月发布。目前已经进入freeze状态,即不再接受新feature,仅fixbug、编写文档和接受安全更新等。目前Go1.16的发布说明尚处于早期草稿阶段,但Go团队成员正在致力于编写发布说明。Go1.16的完全特性列表说明还得等真正发布前才能得到。如今要了解Go1.16功能特性都有哪些变化,只能结合现有的releas
Wesley13 Wesley13
3年前
C# 8.0的三个令人兴奋的新特性
!(http://images2017.cnblogs.com/blog/139239/201710/13923920171031103730980602079392.png)C语言是在2000发布的,至今已正式发布了7个版本,每个版本都包含了许多令人兴奋的新特性和功能更新。同时,C每个版本的发布都与同时期的VisualStudio
Wesley13 Wesley13
3年前
IDEA 终于支持中文版和 JDK 直接下载了(太方便了)附新版介绍视频
!(https://oscimg.oschina.net/oscnet/8db621b0f5dad6210c42645dd5fd84172ce.png)这是我的第48篇原创文章。IDEA2020.1经过了漫长的打磨终于发布正式版了,而这次的版本不止直接支持Java14,还带来了两个重量级的功能:官方中文版支持和JDK直
Wesley13 Wesley13
3年前
Java14来了!Switch竟如此简单?Lombok也不需要了?来用Idea搭建Java14吧!
Java14在2020.3.17日发布正式版了,但现在很多公司还在使用Java7或Java8,每当看到Java又发布新版本心里就慌得一匹。不过此版本并不是LTS(长期支持版)版本,所以不要慌,我们先来了解一下好了,等LTS版本发布后再用也不迟。版本说明现在Java的发布节奏是每年发布两个GA(Gene
手把手带你初探Vue 3.0 | 京东物流技术团队
距离Vue3.0正式发布已经过去一段时间了,2月7日Vue团队正式宣布Vue3正式成为新的默认版本。最近接触的新项目也使用Vue3.0来开发,因此有必要对它进行一波总结和学习。