关于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%…

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理