乐趣区

关于go:Go-119要来了看看都有哪些变化

前言

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%…
退出移动版