0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Go 1.18 正式发布后有哪些特性

马哥Linux运维 来源:OSC开源社区 作者:OSC开源社区 2022-03-30 17:50 次阅读

距离 Go 1.17 发布七个月后,Go 1.18 正式发布了!Go 1.18 是一个包含大量新功能的版本,包括对语言本身做了有史以来最大的改变(泛型)、工具链的实现、运行时和库的更改,还改善了性能。与往常一样,该版本保持了 Go 1的兼容性承诺:几乎所有 Go 程序都能像以前一样继续编译和运行。下面来看一下新版本的一些重大特性:

泛型

以下是关于 Go 1.18 泛型的最明显变化的列表,如需更全面的概述请参阅泛型提案,更详细信息请参阅语言规范。泛型提案:https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md语言规范:https://tip.golang.org/ref/spec

函数和类型声明的语法,现在接受类型参数

参数化函数和类型可以通过在方括号中列出类型参数来实例化。

新标记~已添加到操作符和标点符号中。

接口类型的语法现在允许嵌入任意类型(不仅仅是接口的类型名称)以及 union 和 ~T 类型元素。,这样的接口只能用作类型约束。

新的 预声明标识符 any是空接口的别名,可以用来代替 interface{}。

新的 预声明标识符 comparable是一个接口,表示可以使用==或者 != 比较的所有类型的集合,它只能用作(或嵌入)类型约束。

有三个使用泛型的实验包可能有用,这些包在 x/exp 存储库中;但它们的 API 不在 Go 1 兼容性承诺的保证范围内:

golang.org/x/exp/constraints:对通用代码有用的约束,例如 constraints.Ordered.

golang.org/x/exp/slices:对任何元素类型的切片进行操作的通用函数集合。

golang.org/x/exp/maps:对任何键或元素类型的映射进行操作的通用函数集合。

当前的泛型实现具有以下已知限制:

Go 编译器无法处理泛型函数或方法中的类型声明,计划在 Go 1.19 中取消这个限制。

Go 编译器不接受具有预声明函数 real、imag 和 complex 的参数类型的参数,计划在 Go 1.19 中取消这个限制。

如果 m 由 P 的约束接口显式声明,Go 编译器仅支持在类型参数类型 P 的值 x 上调用方法 m。类似地,方法值 x.m 和方法表达式 P.m 也仅在 m 由 P 显式声明时才受支持,即使 m 可能在 P 的方法集中,因为 P 中的所有类型都实现了 m,计划在 Go 1.19 中取消这个限制。

Go 编译器不支持访问结构字段 x.f,其中 x 是类型参数类型,即使类型参数的类型集中的所有类型都具有字段 f,计划在 Go 1.19 中取消这个限制。

不允许将类型参数或指向类型参数的指针作为结构类型中的未命名字段嵌入,同样地,也不允许在接口类型中嵌入类型参数。

具有多个 term 的 union 元素可能不包含具有非空方法集的接口类型。

泛型代表 Go 生态系统的巨大变化,虽然官方更新了几个支持泛型的核心工具,但还有很多工作要做。剩余的工具、文档和库需要一些时间才能赶上这些语言变化。此外,官方公告中还有这么一段话:

可能会有一些使用泛型的代码可以在 1.18 版本中使用,但在以后的版本中会中断。

我们不计划或期望做出任何此类更改,但是,由于我们今天无法预见的原因,可能需要在未来版本中破坏 1.18 的程序。

我们鼓励在有意义的地方使用泛型,但在生产环境中部署泛型代码时,请谨慎行事。

(虽然泛型是搞出来了,但很可能有 Bug,不建议在生产中使用)

模糊测试

Go 1.18 包括 fuzzing(模糊测试) 的实现,如 fuzzing 提案所述,详情请参阅 fuzzing 教程(https://go.dev/doc/tutorial/fuzz)以开始使用。

注意,模糊测试会消耗大量内存,并且可能会影响机器运行时的性能。

另请注意,模糊引擎在运行时会将扩展测试覆盖率的值写入模糊缓存目录 $GOCACHE/fuzz。目前对可以写入模糊缓存的文件数量或总字节数没有限制,因此可能会占用大量存储空间(可能为 GB 级别)。

编译器

现在编译器可以内联包含范围循环或标记为循环的函数。

编译器的类型检查器被完全替换以支持泛型,一些错误消息可能使用与以前不同的措辞(提供更多详细信息,或以更有用的方式表述)。

由于与支持泛型相关的编译器的更改,Go 1.18 的编译速度可能比 Go 1.17 的编译速度慢大约 15%,代码的执行时间不受影响,目前计划在 Go 1.19 中提高编译器的速度。

Bug fixes

Go 1.18 编译器可以正确地报告在函数文本中设置但从未使用过的变量的错误(已声明但未使用),解决了一个老问题 issue #8560 (https://golang.org/issue/8560)。

Go 1.18 编译器现在在将如 ‘1’ 《《 32 之类的符文常量表达式作为参数传递给预声明函数 print 和 println 时会报告溢出。

Ports

AMD64

Go 1.18 引入了新的GOAMD64环境变量,它在编译时选择 AMD64 架构的最低目标版本,允许的值为v1、 v2、v3或v4,默认是v1。

RISC-V

Linux 上的 64 位 RISC-V 架构(linux/riscv64 端口)现在支持 c-archive 和 c-shared 构建模式。

Linux

Go 1.18 需要 Linux 内核版本 2.6.32 或更高版本。

Windows

windows/arm 和 windows/arm64 端在支持非合作抢占,有希望解决在调用 Win32 函数时遇到的一些细微的 bug,这些bug在很长一段时间内会阻塞。

iOS

在 iOS(ios/arm64 端口)和在基于 AMD64 的 macOS(ios/amd64 端口)上运行的 iOS 模拟器上,Go 1.18 现在需要 iOS 12 或更高版本;已停止支持以前的版本。

FreeBSD

Go 1.18 是支持 FreeBSD 11.x 的最后一个版本,Go 1.19 需要 FreeBSD 12.2+ 或 FreeBSD 13.0+。

性能提升

由于 Go1.17 中寄存器 ABI 调用约定扩展到了 RM64 / Apple M1 / PowerPC 64 架构,因此 Go1.18 对这几个架构包含了高达 20% 的 CPU 性能提升。该 Go 1.18 版本还包含其他大量更新项,完整更新列表请在发行公告(https://tip.golang.org/doc/go1.18)中查看。Go 1.18 相关链接

https ://go.dev/dl/

https ://go.dev/doc/go1.18

https ://go.dev/blog/go1.18

https ://go.dev/blog/tutorials-go1.18

原文标题:Go 1.18正式发布!支持泛型、性能优化。..

文章出处:【微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

审核编辑:彭菁
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7639

    浏览量

    148495
  • API
    API
    +关注

    关注

    2

    文章

    1382

    浏览量

    60992
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61309

原文标题:Go 1.18正式发布!支持泛型、性能优化...

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【GoRK3288】1.Rockchip RK3288, GO!GO!!GO!!!

    语言是谷歌2009发布的第二款开源编程语言, 专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程,而且可以在不损失应用程序
    发表于 08-14 21:07

    Go开发语言的优势在哪里?

    Go语言是谷歌发布的第二款开源编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性,并专门针对多处理器系统应用程序的编程进行了优化,开发速度极快,可以与C或C++媲美,而且更加安全、支持并行
    发表于 03-22 15:04

    CANopen网络管理工具 V1.18

    CANopen网络管理工具 V1.18 网络管理工具
    发表于 11-15 17:12 74次下载

    无滞后有相控电路

    无滞后有相控电路
    发表于 02-20 21:33 484次阅读
    无滞<b class='flag-5'>后有</b>相控电路

    nVIDIA Quadro4 Go GL显示芯片

    nVIDIA Quadro4 Go GL显示芯片  Quadro4 Go GL是nVIDIA公司在2002年4月23日为了对抗ATI公司Mobility FireGL 7800而发布的移动专业级显示芯片,其中包括Qu
    发表于 01-22 11:43 653次阅读

    GO语言简介!GO是理想的编程语言吗?

    技术实力毋容置疑,不过这哥俩都是玩Kernel的,经历相同,理念相近,分歧会比较少,他们也都坦承C用得最多最熟,所以注定了GO的类C特性,不过这会不会导致GO设计上的思维火花不足,对OOP以及现代编程思想的支持不足,亦未可知。
    的头像 发表于 04-29 09:47 4144次阅读
    <b class='flag-5'>GO</b>语言简介!<b class='flag-5'>GO</b>是理想的编程语言吗?

    谷歌发布Pixelbook Go笔记本,采用ChromeOS系统

    10月15日消息,一年一度的谷歌新品发布会在美国纽约召开,谷歌正式发布了Pixelbook Go笔记本,继续采用ChromeOS系统。起售价649美元。
    的头像 发表于 10-16 15:36 3064次阅读

    汉王科技发布“出头鸟201”和“Go Go Bird 1000”系列仿生扑翼鸟

    汉王科技发布出头鸟201和Go Go Bird 1000系列仿生扑翼鸟。 据介绍,Go Go Bird 1000是高仿真扑翼飞行器,从自然界
    的头像 发表于 10-21 15:43 7146次阅读

    详解GO语言的趋势与使用情况

    Go 语言简单易学、性能优良。JetBrains Blog 发布Go 语言的调查报告,看看GO 语言当前趋势吧!
    的头像 发表于 03-17 11:05 2806次阅读

    Go+1.0即将发布——让改变发生

    10月15日,Go+1.0发布会将于上海召开,会上将发布Go+1.0的相关特性Go+的发展路线
    的头像 发表于 10-11 14:49 1039次阅读

    Go语言创始人反对在Go 1.18的标准库中引入泛型支持

    近日,Go 语言创始人之一 Rob Pike 在 Github 上发表评论引发关注。据悉,他已在 Go 代码仓库提交了一个 issue (#48918),反对在 Go 1.18 的标准
    的头像 发表于 10-26 09:45 1654次阅读
    <b class='flag-5'>Go</b>语言创始人反对在<b class='flag-5'>Go</b> <b class='flag-5'>1.18</b>的标准库中引入泛型支持

    七牛云发布Go+1.0,贡献一行代码,让改变发生

    近日,七牛云提出了Go+静态编程语言,正式发布了1.0版本并启动了Go+开发者基金会。据媒体报道,七牛云此次发布Go+ 1.0能够为大型工
    的头像 发表于 11-26 12:39 814次阅读
    七牛云<b class='flag-5'>发布</b><b class='flag-5'>Go</b>+1.0,贡献一行代码,让改变发生

    Go并发模型的实现原理

    Go语言是为并发而生的语言,Go语言是为数不多的在语言层面实现并发的语言;也正是Go语言的并发特性,吸引了全球无数的开发者。
    的头像 发表于 04-15 08:49 1057次阅读

    Go 1.18 版本新功能解读

    9 月 8 日,Go 语言社区发布 2022 年第二季度开发者调查报告,本次调研覆盖 5752 位受访开发者,主题涉及他们在使用 Go 1.18 全新功能
    的头像 发表于 09-15 09:45 1033次阅读

    Go开源13周年 2022发布更多改变的Go 1.18Go 1.19版本

    Go 来说,2022 是非常重要的一年,这一年  Go 发布了 Go 1.18 和 Go 1.
    的头像 发表于 11-17 16:37 891次阅读