前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go1.18新特性(翻译)

go1.18新特性(翻译)

作者头像
golangLeetcode
发布2022-08-03 13:57:38
1.5K0
发布2022-08-03 13:57:38
举报
文章被收录于专栏:golang算法架构leetcode技术php

尝试翻译下文档https://tip.golang.org/doc/go1.18

1.语言

范型

go1.18 实现了《类型参数提案》描述的范型特性,并且保持了对老版本的向下兼容

https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md

这些新的特性带来了大量源码的更新,但是这些代码尚未在生产环境进行过大规模的测试。这就需要更多的人使用范型来编写go代码。我们相信这一功能设计严谨、质量很高。但是不像go的其他方面的特性,我们不能保证大家的实践体验和我们预期的一样美好。因此,虽然我们鼓励大家在特定的场景下合理使用泛型,但在生产环境中部署泛型代码时还需要谨慎。

虽然我们相信这个新的语言功能设计得很好,并且定义明确,但我们也可能犯了错误。我们想重申《Go 1兼容性保证》

https://tip.golang.org/doc/go1compat中的规定:“如果有必要在规范中引入不一致或不完整的特性,解决掉所有可能会影响现有程序的语义或合法性的问题。我们保留发布这种issue的权利,包括更新和新功能实现。” 它还规定,“如果一个编译器或库有bug影响到了这个规范,即使我们修复了bug,依赖这种有bug行为的程序可能会崩溃。我们保留修复此类bug的权利。”翻译成人话,使用泛型的代码在1.18版本运行正常,但在以后的版本中可能会出bug,我们不计划做出此类变更。然而,由于我们今天无法预见的原因,在未来的版本中破坏1.18程序也是可能的。我们将尽可能减少此类破坏,但不能保证没有。

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

  • 函数和类型声明的语法现在接受类型参数。
  • 参数化函数和类型可以通过在方括号中列出类型参数来实例化。
  • 新的token~已添加到运算符和标点符号集中。
  • 接口类型的语法现在允许嵌入任意类型(不仅仅是接口的类型名)以及union和~T类型元素。此类接口只能用作类型约束。接口现在的定义是一组类型和一组方法的集合。
  • 新的预声明标识符any是空接口的别名。它可以用来代替interface{}。
  • 新的预声明标识符comparable是一个接口,它表示可以使用==或!=进行比较的所有类型的集合。它只能用作(或嵌入)于类型约束。

有三个使用泛型的实验包可能很有用。这些包位于x/exp目录中;他们的API不在Go 1规范范围内,随着我们在泛型方面获得更多经验,他们的API可能会发生变化。

golang.org/x/exp/constraints

泛型代码用到的常量,例如constraints.Ordered.

golang.org/x/exp/slices

对任何元素类型的切片进行操作的泛型函数集合。

golang.org/x/exp/maps

对任何键或元素类型的map进行操作的通用函数集合。

当前版本的泛型实现有以下限制:

  • Go编译器目前无法处理泛型函数或方法中的类型声明。我们希望在Go 1.19中为该功能提供支持。
  • Go编译器目前不接受参数类型为real、imag和complex的预声明函数。我们希望在Go 1.19中取消这一限制。
  • Go编译器目前只支持在m显式声明满足P的接口约束的情况下,对值x的参数类型为P的m方法进行调用。类似地,方法值x.m和方法表达式P.m也仅在m由P显式声明时才受支持,即使m可能位于P的方法集中,因为P中的所有类型都实现了m。我们希望在Go 1.19中消除这一限制。
  • 不允许将类型参数或指向类型参数的指针作为未命名字段嵌入结构类型中。同样,不允许在接口类型中嵌入类型参数。目前尚不明确这些限制在将来是否会被消除。
  • 具有多个元素的union ,不能包含具有非空方法集的interface{}。目前尚不明确这些限制在将来是否会被消除。

bug修复

在函数作用域中声明但从未使用过的变量, Go 1.18编译器现在可以正常报错。Go 1.18之前,在这种情况下编译器没有报错。这个长期悬而未决的编译器问题终于被修复了https://golang.org/issue/8560。由于这种变化,以前可能能够编译通过的程序现在会报错。修复很简单:如果程序确实有问题,不合法地使用了这种变量,可以将它赋值给_来解决这个问题。

Go 1.18编译器现在将rune量表达式(如'1'<<32)作为参数传递给预声明函数print和println时如果溢出能够正常检查出来,这与用户定义函数的预期的行为一致。在Go 1.18之前,编译器不会在这种情况下报告错误,但会在能够隐式转换成int64的情况下接受此类常量参数。由于这种变化,(可能不正确)程序可能无法编译通过。必要的修复很简单:如果程序实际上不正确,就修复它,或者显式地将有问题的参数转换为正确的类型。因为go vet能够扫描出此类错误,所以受影响的程序数量可能非常少。

2.接口

AMD64

Go 1.18引入了新的GOAMD64环境变量,该变量在编译时选择AMD64体系结构的最低目标版本。允许的值为v1、v2、v3或v4。如果想使用高版本的特性,详细的描述可以在这里找到。

https://golang.org/wiki/MinimumRequirements#amd64

GOAMD64环境变量默认为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接口现在支持非协作式抢占,将该功能引入所有四个windows接口,有望解决在调用长时间阻塞的Win32函数时遇到的细微错误。

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+。FreeBSD 13.0+需要一个设置了COMPAT_FREEBSD12的内核选项(这是默认设置)。

3.工具

Fuzzing

Go 1.18实现了模糊测试提案https://golang.org/issue/44551

详细可以参考模糊测试的介绍https://go.dev/doc/fuzz

需要注意的是模糊测试会消耗大量内存,并可能会影响机器运行时的性能。还要注意,模糊引擎在运行时会将扩展测试覆盖范围的数据写入$GOCACHE/fuzz缓存目录。目前,可能写入fuzz缓存的文件数或总字节数没有限制,因此它可能会占用大量存储空间(可能是几GB)。

Go command

go常用的命令有很多地方有更新,不一一详细翻译了。

go get
Automatic go.mod and go.sum updates
go version
go mod download
go mod vendor
go mod tidy
go work
go build -asan
go test
//go:build lines

Gofmt

Vet

Updates for Generics
Precision improvements for existing checkers

4.运行时

在特定的gc频率,垃圾收集器现在的工作包括了非堆源(例如堆栈扫描)的垃圾收集工作。因此,当这些源内存占用很大时,垃圾收集器的开销更容易预测。对于大多数应用来说,这些变化可以忽略不计;然而,一些Go应用程序现在可能比以前使用更少的内存,在垃圾收集上花费更多的时间,反之亦然。这个改动的目的是减少不必要的GOGC。

运行时现在可以更高效地将内存返回到操作系统,此调整将带来更高的运行效率。

Go 1.17修改了堆栈跟踪中参数的格式,但在打印寄存器中传递的参数值可能不准确。在Go 1.18中,会在每个可能不准确的值之后加上(?)。

当必须分配一个新的底层数组时,内置函数append现在在决定切片的增长量时使用了一个稍微不同的公式。新公式不太容易出现内存激增。

5.编译器

在指定的操作系统上,Go 1.17使用寄存器而不是64x86体系结构上的堆栈来传递函数参数和返回值。Go 1.18扩展了受支持的平台,在所有操作系统上包括64ARM(GOARCH=arm64)、大端和小端64PowerPC(GOARCH=ppc64、ppc64le)以及64x86体系结构(GOARCH=amd64)。在64ARM和64PowerPC系统上,基准测试显示了10%或更多的性能提升。

正如Go 1.17发行说明中提到的,此更改不会影响任何Go代码的功能,并且不会影响大多数汇编代码。有关更多详细信息,请参阅Go 1.17发行说明。https://tip.golang.org/doc/go1.17#compiler

编译器现在可以内联包含range循环或带label的for循环的函数。

new-asan编译器选项支持new go命令-asan选项。

由于编译器的类型检查器被完全替换以支持泛型,因此一些错误消息现在可能会使用与以前不同的措辞。在某些情况下,pre Go 1.18错误消息提供了更详细的信息,或者以更有用的方式表达。我们打算在Go 1.19中详细描述这些内容。

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

6.连接器

链接器减少了重定位https://tailscale.com/blog/go-linker/。因此,大多数代码库将更快地链接,需要更少的内存来链接,并生成更小的二进制文件。处理Go二进制文件的工具应该使用Go 1.18的debug/gosym包来透明地处理新旧二进制文件。

new-asan链接器选项支持新的go命令-asan选项。

7.引导程序

从源代码构建Go版本时,如果未设置GOROOT_BOOTSTRAP 环境变量,则Go的早期版本会在目录HOME/go1(%HOMEDRIVE%%HOMEPATH%\go1.4 on Windows)中查找Go 1.4或更高版本的引导工具链。Go现在首先寻找HOME/go1.17或HOME/sdk/go1.17目录,失败后才回到HOME/go1.4.我们打算让Go 1.19要求Go 1.17或更高版本用于引导,这一更改应该会使过渡更加平滑。有关更多详细信息,请参阅https://go.dev/issue/44505

8.核心库

New debug/buildinfo package

New net/netip package

TLS 1.0 and 1.1 disabled by default client-side

Rejecting SHA-1 certificates

Minor changes to the library

bufio

bytes

crypto/elliptic

crypto/tls

crypto/x509

debug/dwarf

debug/elf

debug/plan9obj

go/ast

go/constant

go/token

go/types

html/template

image/draw

net

net/http

os/user

reflect

regexp

runtime/debug

runtime/pprof

strconv

strings

sync

syscall

syscall/js

testing

text/template

text/template/parse

unicode/utf8

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • AMD64
  • Fuzzing
    • go get
      • Automatic go.mod and go.sum updates
        • go version
          • go mod download
            • go mod vendor
              • go mod tidy
                • go work
                  • go build -asan
                    • go test
                      • //go:build lines
                      • Gofmt
                      • Vet
                        • Updates for Generics
                          • Precision improvements for existing checkers
                          • New debug/buildinfo package
                          • New net/netip package
                          • TLS 1.0 and 1.1 disabled by default client-side
                          • Rejecting SHA-1 certificates
                          • Minor changes to the library
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档