大家好,我是煎鱼。

感觉时间过得很快,Go1.18 发布没太久,泛型还在风风火火,看了看上次的投票结果,绝大部分同学还没有在生产环境应用泛型。

这不,Go1.19 Beta1 已经正式发布了。今天就由煎鱼和大家围观《Go 1.19 Release Notes[1]》中一些有意思的特性。

内存模型

Go 的内存模型已被修订,以使 Go 与 C、C++、Java、JavaScript、Rust 和 Swift 使用的内存模型保持一致。Go 只提供顺序一致的原子学,而不是其他语言中的任何更宽松的形式。

另外随着内存模型的更新,Go1.19 在 sync/atomic 包中引入了新的类型,使之更容易使用原子值,如 atomic.Int64 和 atomic.Pointer[T]。

文档做了以下具体的修改:

  • 记录 Go 的整体内存模型描述。

  • 记录 multiword 竞态会导致崩溃的情况。

  • 记录 runtime.SetFinalizer 的 happens-before。

  • 记录(或链接)更多同步类型的发生前。

  • 记录同步/原子的发生时间,匹配 C++ 的顺序一致的原子(以及Java、JavaScript、Rust、Swift、C...)。

  • 记录不允许的编译器优化。

这个只是 “修订”,是改了文档和定义,并不涉及内存模型的代码变更。

为此 Russ Cox 写了 Go Memory Model 的三篇文章作为系列说明:

  • 《Hardware Memory Models[2]

  • 《Programming Language Memory Models[3]

  • 《Updating the Go Memory Model[4]

有兴趣的同学可以阅读。

文档规范

Russ Cox 在提案《Proposal: go/doc: headings, lists, and links in Go doc comments[5]》中,增加了对文档注释中的链接、列表和更清晰的标题的支持。

Go 1.19 文档已经发生了变化。如下:

旧(左)与新(右)的对比图。

手动贴链接变可跳转:

手动分行变成无序列表区分:

这算是 Go 文档从远古时代到新 Markdown 的一个大升级了。

构建约束

从 Go1.19 起,构建约束 unix 现在可以在 //go:build 行中被识别,能够起到配套的约束作用。

如下格式:

//go:build unix

需要注意的是,在 1.19 版本中,如果 GOOS 是 aix、android、darwin、dragonfly、freebsd、hurd、illumos、ios、linux、netbsd、openbsd 或 solaris 中的一种,也是满足 unix 约束的。

龙芯架构

龙芯(Loongson)是由中国科学院计算技术研究所、龙芯中科、神州龙芯等机构、公司所设计的一系列各种芯片(包括通用中央处理器、SoC、微控制器、芯片组等)。

在 Go 1.19 起增加了对 Linux 上 Loongson 64 位架构的支持(GOOS=linux,GOARCH=loong64)。

前段时间还看到龙芯中科,在科创板上市,成国产 CPU 第一股。国产芯片走进 Go 语言,应该也是国人推进的,太强了!

竞态检测

Go 的竞态资源检测(race detector)已经发布到 v3 版本了,将会跟随 Go1.19 一起上线到生产可用。

与 v2 版相比,新版本的 race detector 在性能上快 1.5 倍到 2 倍,使用一半的内存,并且支持无限数量的 goroutine。

注:windows/amd64 和 openbsd/amd64 暂未支持。

Switch 性能提高

Go 编译器现在使用 jump table[6] 来实现大型整数和字符串类型的 swicth 语句。switch 语句的性能改进各不相同,但可以快 20% 左右。

注:本次仅涉及 GOARCH=amd64GOARCH=arm64 的变更。

运行时

堆内存限制

新版本的 Go 增加了 runtime.SetMemoryLimit 函数和 GOMEMLIMIT 环境变量。

关注到 runtime.SetMemoryLimit 函数为运行时提供了一个内存的软限制。

函数签名为:

func SetMemoryLimit(limit int64) int64

有了这个内存的软限制后,Go 运行时将会遵守这个内存限制,行为包括:调整垃圾回收的频率、更积极地将内存返回到底层系统等,来维持这个软内存的限制。

另外即使 GOGC=off(或者是执行了 SetGCPercent(-1) 函数),也会遵守软内存的限制。

有了内存软限制,一般场景下,可以有效的防止由于堆内存分配过多,导致 Go 进程超出系统内存资源的最大被 KILL 的场景。

一个漏网之鱼,是限制不了的。那就是它不包括:Go 二进制使用的空间和 Go 外部的内存,例如:由底层系统代表进程管理的内存,或由同一进程中的非 Go 代码管理的内存(CGO)。

Goroutine 堆栈

新版本中 Go 运行时将根据 goroutine 的历史平均堆栈使用率来分配初始 goroutine 堆栈(大雾,太坏了,Go 面试题的题目答案又要改了...)。

可以有效避免一些不必要的堆栈增长和复制,在低于平均水平的情况下,能节省最多 2 倍的空间浪费。

这是一个比较细致的优化点了。

泛型改进

Go1.19 还在不断地完善泛型的路上,这次变更来自规范《spec: adjust scope of type parameters declared by method receivers[7]》,涉及到的是对方法声明中类型参数的范围做了一个非常小的修正。

原有描述:

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.

修订描述:

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.

在 Go1.18 时,以下泛型代码会提示错误:

type T[T any] struct {}func (T[T]) m() {} // error: T is not a generic type

在新版本(1.19 起)将会正确支持,不会发生编译错误。

其他的泛型进度来讲,还是在修修补补:

有待继续观察。

总结

在本次 Go1.19 的新版本更新中,新特性是比较少的。其中主要的原因还是泛型的各项工作给 Go 团队带来了不少的工作量。

今年也陆续有个别大佬离开,所以整体可用于其他新特性的时间就比较少了。

这个版本可以认为是小版本,填了一些小 “坑” 了,国内个别面试题的答案也会因此有所改变了。

参考资料

[1]

Go 1.19 Release Notes: https://tip.golang.org/doc/go1.19

[2]

Hardware Memory Models: https://research.swtch.com/hwmm

[3]

Programming Language Memory Models: https://research.swtch.com/plmm

[4]

Updating the Go Memory Model: https://research.swtch.com/gomm

[5]

Proposal: go/doc: headings, lists, and links in Go doc comments: https://github.com/golang/proposal/blob/master/design/51082-godocfmt.md

[6]

jump table: https://en.wikipedia.org/wiki/Branch_table

[7]

spec: adjust scope of type parameters declared by method receivers: https://github.com/golang/go/issues/52038

关注和加煎鱼微信,

获取一手业内消息和知识,拉你进交流群

Go1.19 那些事:国产芯片、内存模型等新特性,你知道多少?相关推荐

  1. Java内存模型及三大特性

    在了解Java的内存模型之前先了解下计算机处理并发的模型处理: 由于计算的处理器的处理速度与存储设备的读写速度的差异较大,所以加入一层读写接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之 ...

  2. 十月重点回顾:EasyDL八大国产芯片实现模型部署全适配!

    10 月,EasyDL 模型部署国产芯片适配类型丰富度再进一步,新增「飞腾 CPU」.「龙芯 CPU」.「寒武 纪 MLU270」.「比特大陆 SC5+」4 款国产芯片部署能力,实现八大主流国产芯片全 ...

  3. linux内核那些事之Sparse内存模型初始化

    由于现在运行的设备中大都采用sparse内存模型,而<understanding the linux virtual memory manager>书中主要以2.4和2.6内核源码基础上进 ...

  4. JMM内存模型 多线程三大特性

    本文目录 1.JMM 内存模型 1.主内存 2.工作内存 3.JMM 线程操作内存的两条基本规定 4.JMM 模型八大内存交互指令 5.JMM 模型内存交互操作 6.JMM 模型内存同步规则 2.多线 ...

  5. 12c oracle 修改内存_Oracle12c中性能优化功能增强新特性之重大突破——内存列存储新特性...

    Oracle12c中内存列存储 内存列存储(IM column store) 是Oracle12.1.0.2版本的主要特点.该特点允许列,表,分区和物化视图在内存中以列格式存储,而不是通常的行格式.数 ...

  6. 12c oracle 修改内存_Oracle12c中性能优化amp;功能增强新特性之重大突破——内存列存储新特性...

    内存列存储(IM column store) 是Oracle12.1.0.2版本的主要特点.该特点允许列,表,分区和物化视图在内存中以列格式存储,而不是通常的行格式.数据存在内存中的好处显而易见,而列 ...

  7. oracle19c内存管理,19c新特性之Automatic In-memory

    在Oracle数据库12.1中,Heat Map作为自动数据优化(ADO)的一个特性引入. 在Oracle数据库12.2中,Heat Map特性增加了对Inmemory功能的支持. 在Oracle数据 ...

  8. Java内存模型的历史变迁

    转自:http://www.csdn.net/article/2015-05-20/2824722-Java 摘要:本文通过介绍Java的新/旧内存模型,来展示Java技术的历史变迁. 本文通过介绍J ...

  9. Java多线程编程笔记4:Java内存模型

    Java内存模型 Java内存模型试图屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果. 处理器上的寄存器读写速度比内存快几个数量级,为了解决这种速度矛 ...

最新文章

  1. PHP-Curl模拟HTTP请求
  2. 谁是卧底的Android应用 (原型源码)
  3. ASP.NET生成缩略图类C#代码
  4. boost::locale::generator用法的测试程序
  5. 入驻支付宝开放平台并创建应用的基本流程
  6. 离屏渲染在车载导航中的应用
  7. 深度学习《GAN模型学习》
  8. 蒜黄香菇炒肉 【原创】
  9. ScrollView的学习
  10. 蓝桥杯 ADV-72 算法提高 一元一次方程
  11. mongodb 插入一个数组 java_mongodb:推送到数组元素的子数组或添加到数组(如果不存在)...
  12. 使用python来刷csdn下载积分(一)
  13. 网络工程师考试-计算机网络笔记
  14. Maven开发笔记(三)—— Maven中dependencies和dependencyManagement
  15. matlab改进平方根算法,改进平方根请教
  16. 植物病虫害识别方法主要研究思路
  17. 逻辑设计基础_芯片设计--TCAM概述
  18. 电视剧《奋斗》精彩对白节选---(一)
  19. 【HTML基础-1】HTML标签简介及常用标签
  20. 内存分配函数(动态内存分配)详解

热门文章

  1. 在linux系统上怎么架设服务器吗,Linux下各种服务器的架设详解
  2. 【JavaScript】鼠标、键盘的基础事件
  3. [题目解析]乐乐的数字
  4. matplotlib 绘图非洲国家GDP排行前12的国家python
  5. 腾讯要放弃 TIM 了?
  6. html站点是啥意思,html啥意思
  7. 数列极限的四则运算法则
  8. Linux下通过命令行登录北交校园网
  9. 金蝶外贸进出口行业解决方案(K/3 Cloud、EAS版)
  10. 【信号处理】Matlab实现语音变速变调