前言
Go 官网团队在 2022.06.11 公布了 Go 1.19 Beta 1 版本,Go 1.19 的正式 release 版本预计会在往年 8 月份公布。
让咱们先睹为快,看看 Go 1.19 给咱们带来了哪些变动。
这是 Go 1.19 版本更新内容详解的第 1 篇,欢送大家关注公众号,及时获取本系列最新更新。
Go 1.19 公布清单
和 Go 1.18 相比,改变绝对较小,次要波及语言 (Language)、内存模型(Memory Model)、可移植性(Ports)、Go Tool 工具链、运行时(Runtime)、编译器(Compiler)、汇编器(Assembler)、链接器(Linker) 和外围库 (Core library) 等方面的优化。
咱们一一看看具体都有哪些变动。
语言变动
语言层面的变动很小,只有一个和泛型相干的优化,调整了泛型函数和办法申明里的类型参数 (type parameter) 的作用域,不影响现有代码。
为什么会有这个调整呢?咱们来看看如下的代码
type T[T any] struct {m1 T}
这段代码定义了泛型类型 T
,类型参数列表(type parameter list) 里的类型参数 (type parameter) 命名也是T
,代码能够失常编译通过。
然而如下代码呢?
type T[T any] struct {m1 T}
func(t T[T]) print() {fmt.Println(t.m1)
}
咱们定义了泛型类型T
的办法print
,编译下面的代码,编译器会提醒:
./main.go:11:8: T is not a generic type
也就是说编译器认为办法 print
里的第一个 T
不是泛型类型,为什么会这样呢?咱们来看看官网阐明:
The scope of an identifier denoting a type parameter of a function or declared by a method receiver is the function body and all parameter lists of the function.
这段阐明对应到下面的代码,编译器会认为 print
办法里的第 2 个 T
(类型参数T
) 的作用域是函数体以及函数的参数列表 (这里的参数列表包含办法 receiver parameter list 和函数名前面的参数列表)。因而第 2 个T
就笼罩了第 1 个T
,所以编译器会提醒T is not a generic type
。
这个问题是由 Go101 作者提出来的,Go 泛型的设计者 Robert Griesemer 认领了这个问题,把类型参数的作用域依照如下阐明进行调整:
The scope of an identifier denoting a type parameter of a function or declared by a method receiver starts after the function name and ends at the end of the function body.
也就是类型参数的作用域是从函数名前面开始始终到函数体,这样下面的代码里的 2 个T
的就不会笼罩第 1 个T
,编译器也就不会编译报错了。
想理解 Go 泛型的应用办法、设计思路和最佳实际,举荐大家浏览:
- 官网教程:Go 泛型入门
- 一文读懂 Go 泛型设计和应用场景
- 重磅:Go 1.18 将移除用于泛型的 constraints 包
- 泛型最佳实际:Go 泛型设计者教你如何用泛型
内存模型
Go 内存模型 在 Go 1.19 版本做了批改,和 C, C++, Java, JavaScript, Rust 和 Swift 对齐。Go 只提供程序统一原子操作(sequentially consistent atomics),不提供其它语言里更宽松的内存模型,比方因果一致性(casual consistency)、最终一致性(eventual consistency)。
随同着内存模型的批改,Go 1.19 版本在 sync/atomic
包里引入了新的类型,例如 atomic.Int64 和[atomic.Pointer[T]](https://pkg.go.dev/sync/atomi…),这些新的类型能够让开发者应用原子操作时更容易。
想理解 Go 原子操作和应用办法,举荐大家浏览:
- Go 并发编程之原子操作 sync/atomic
可移植性
Go 1.19 版本反对 Linux 操作系统上的中国龙芯 64 位 CPU 架构。
GOOS=linux
GOARCH=loong64
此外,Go 当初反对在 riscv64
架构上应用寄存器来传递函数参数和函数执行后果。性能测试表明,riscv64
架构上的 Go 语言性能晋升了大略 10%。
总结
下一篇会介绍 Go 1.19 在 Go Tool 工具链、运行时、编译器、汇编器、链接器和外围库的优化工作,有一些内容值得学习,欢送大家放弃关注。
开源地址
文章和示例代码开源在 GitHub: Go 语言高级、中级和高级教程。
公众号:coding 进阶。关注公众号能够获取最新 Go 面试题和技术栈。
集体网站:Jincheng’s Blog。
知乎:无忌。
福利
我为大家整顿了一份后端开发学习材料礼包,蕴含编程语言入门到进阶常识(Go、C++、Python)、后端开发技术栈、面试题等。
关注公众号「coding 进阶」,发送音讯 backend 支付材料礼包,这份材料会不定期更新,退出我感觉有价值的材料。还能够发送音讯「进群」,和同行一起交流学习,答疑解惑。
References
- https://tip.golang.org/doc/go…
- https://int64.me/2020/%E4%B8%…