Go 1.13 Release Notes

Introduction to Go 1.13

Go的最新发行版(版本1.13)比Go 1.12晚了六个月. 它的大部分更改是在工具链,运行时和库的实现中进行的. 与往常一样,该发行版保留了Go 1 兼容性的承诺 . 我们希望几乎所有Go程序都能像以前一样继续编译和运行.

从Go 1.13开始,默认情况下,go命令使用Google运行的Go模块镜像和Go校验和数据库下载并验证模块. 有关这些服务的隐私信息,请参阅https://proxy.golang.org/privacy ;有关配置详细信息(包括如何禁用这些服务器或使用其他服务器)的信息,请参阅go命令文档 . 如果您依赖于非公共模块,请参阅用于配置环境文档 .

Changes to the language

Per the number literal proposal, Go 1.13 supports a more uniform and modernized set of number literal prefixes.

根据签署的班次计数建议, Go 1.13消除了必须对班次计数未签名的限制. 此更改消除了为实现<<>>运算符的此限制(现已删除)而专门引入的许多人工uint转换的需求.

这些语言更改是通过对编译器的更改以及对库包go/scannertext/scanner (数字文字)以及go/types (带符号移位计数)的内部更改而实现的.

如果您的代码使用模块,并且go.mod文件指定了语言版本,请确保将其设置为至少1.13以访问这些语言更改. 您可以通过直接编辑go.mod文件来执行此操作,也可以运行go mod edit -go=1.13 .

Ports

Go 1.13是将在Native Client(NaCl)上运行的最新版本.

对于GOARCH=wasm ,新的环境变量GOWASM带有逗号分隔的实验功能列表,二进制文件使用该列表进行编译. 有效值在此处记录 .

AIX

PPC64( aix/ppc64 )上的AIX现在支持cgo,外部链接以及c-archivepie构建模式.

Android

Go程序现在与Android 10兼容.

Darwin

正如Go 1.12发行说明中所宣布的那样,Go 1.13现在需要macOS 10.11 El Capitan或更高版本; 不再支持以前的版本.

FreeBSD

正如Go 1.12发行说明中所宣布的那样,Go 1.13现在需要FreeBSD 11.2或更高版本. 不再支持以前的版本. FreeBSD 12.0或更高版本需要一个带有COMPAT_FREEBSD11选项集的内核(这是默认设置).

Illumos

Go现在使用GOOS=illumos支持Illumos. illumos build标签暗指solaris build标签.

Windows

内部链接的Windows二进制文件指定的Windows版本现在是Windows 7,而不是NT 4.0. 这已经是Go的最低要求版本,但是会影响具有向后兼容模式的系统调用的行为. 现在,它们将按照记录的方式运行. 外部链接的二进制文件(使用cgo的任何程序)始终指定了更新的Windows版本.

Tools

Modules

Environment variables

GO111MODULE环境变量继续默认设置为auto ,但是无论当前工作目录包含go.mod文件或在包含go.mod文件的目录下, auto设置现在都会激活go命令的模块感知模式-即使当前目录在GOPATH/src . 此更改简化了GOPATH/src中现有代码的迁移,并简化了对具有模块感知能力的软件包以及对非模块感知的进口商的维护.

新的GOPRIVATE环境变量指示不公开可用的模块路径. 它用作较低级别的GONOPROXYGONOSUMDB变量的默认值,它们对通过代理获取并使用校验和数据库进行验证的模块提供了更细粒度的控制.

现在可以将GOPROXY环境变量设置为以逗号分隔的代理URL列表或特殊令牌direct ,并且其默认值现在为https://proxy.golang.org,direct . 在解析到其包含模块的软件包路径时, go命令将连续尝试列表中每个代理上的所有候选模块路径. 除404或410之外的不可访问代理或HTTP状态代码将终止搜索,而无需咨询其余代理.

新的GOSUMDB环境变量标识数据库的名称,还可以标识数据库的公用密钥和服务器URL,以查询尚未在主模块的go.sum文件中列出的模块的go.sum . 如果GOSUMDB不包含显式URL,则通过对指示支持校验和数据库的端点的GOPROXY URL进行探测来选择URL,如果任何代理不支持它,则回退到与命名数据库的直接连接. 如果将GOSUMDB设置为off ,那么将不查询校验和数据库,并且仅验证go.sum文件中现有的校验和.

谁也无法达到的默认代理和校验数据库(例如,由于防火墙或沙盒配置),用户可以通过设置禁止其使用GOPROXYdirect和/或GOSUMDBoff . go env -w可用于为这些变量设置默认值,而与平台无关:

go env -w GOPROXY=direct
go env -w GOSUMDB=off

go get

在模块感知模式下,带有-u标志的go get现在将更新较小的模块集,该模块集与在GOPATH模式下由go get -u更新的软件包集更加一致. go get -u继续更新在命令行上命名的模块和软件包,但仅更新包含命名软件包导入的软件包的模块,而不更新包含命名软件包的模块的传递模块要求.

特别go注意的是, go get -u (不带附加参数)现在仅更新当前目录中软件包的可传递导入. 要改为更新由主模块传递的所有软件包(包括测试依赖项),请使用go get -u all .

由于上述对go get -u更改, go get子命令不再支持-m标志,这导致go get在加载软件包之前停止. -d标志仍然受支持,并且在下载构建命名包依赖项所需的源代码后,继续使go get停止.

默认情况下,在模块模式下, go get -u仅升级非测试依赖项,例如在GOPATH模式下. 现在,它还接受-t标志,该标志(如在GOPATH模式下一样)使go get包含通过测试在命令行上命名的软件包导入的软件包.

In module-aware mode, the go get subcommand now supports the version suffix @patch. The @patch suffix indicates that the named module, or module containing the named package, should be updated to the highest patch release with the same major and minor versions as the version found in the build list.

如果作为参数传递到模块go get不带版本后缀已经需要在比最新发布的版本新的版本,它会保持在较新的版本. 这与模块相关性的-u标志的行为一致. 这样可以防止从预发行版本意外降级. 新版本后缀@upgrade明确请求此行为. @latest显式请求最新版本,而不管当前版本如何.

Version validation

从版本控制系统中提取模块时, go命令现在对所请求的版本字符串执行附加验证.

+incompatible版本注释绕过了在引入模块之前对存储库进行语义导入版本控制的要求. 现在, go命令可以验证该版本是否不包含显式的go.mod文件.

go命令现在验证伪版本和版本控制元数据之间的映射. 特别:

如果主模块中require指令使用了无效的伪版本,通常可以通过将版本编辑为仅提交哈希值并重新运行go命令(例如go list -m allgo mod tidy来进行更正. 例如,

require github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c

可以编辑为

require github.com/docker/docker e7b5f7dbe98c

目前解析为

require github.com/docker/docker v0.7.3-0.20190319215453-e7b5f7dbe98c

如果主模块的传递依赖项之一要求使用无效版本或伪版本,则可以使用主模块go.mod文件中的replace指令将无效版本替换为有效版本. 如果替换是提交哈希,它将被解析为上述适当的伪版本. 例如,

replace github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c => github.com/docker/docker e7b5f7dbe98c

目前解决

replace github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c => github.com/docker/docker v0.7.3-0.20190319215453-e7b5f7dbe98c

Go command

go env命令现在接受-w标志来设置go命令可以识别的环境变量的每用户默认值,并接受相应的-u标志以取消设置先前设置的默认值. 通过go env -w设置的默认值存储在os.UserConfigDir()中的go/env文件中.

现在, go version命令接受命名可执行文件和目录的参数. 当在可执行文件上调用go versiongo打印用于构建可执行文件的Go版本. 如果使用-m标志,则go version打印可执行文件的嵌入式模块版本信息(如果有). 当在目录上调用go version ,它将打印有关目录及其子目录中包含的可执行文件的信息.

新的go build标志 -trimpath从编译的可执行文件中删除所有文件系统路径,以提高构建的可重复性.

如果传递给go build-o标志引用了现有目录,则go build现在将在该目录中为与其包参数匹配的main包写入可执行文件.

go build flag -tags现在采用逗号分隔的build标签列表,以允许在GOFLAGS使用多个标签. 以空格分隔的表单已弃用,但仍然可以识别并会保留.

go generate现在设置了generate build标签,以便可以在文件中搜索指令,但是在构建过程中将其忽略.

正如Go 1.12发行说明中所宣布的那样,不再支持仅二进制包. 现在,构建仅二进制包(标有//go:binary-only-package注释)会导致错误.

Compiler toolchain

编译器具有更精确的转义分析新实现. 对于大多数Go代码来说,应该是一个改进(换句话说,更多的Go变量和表达式分配在堆栈上而不是堆上). 但是,这种提高的精确度还可能破坏以前发生过的无效代码(例如,违反了unsafe.Pointer安全规则的代码). 如果您发现任何相关的回归,可以使用go build -gcflags=all=-newescape=false来重新启用旧的转义分析通道. 在将来的版本中,将删除使用旧的转义分析的选项.

编译器不再向go_asm.h文件发出浮点数或复数常量. 这些总是以无法在汇编代码中用作数字常量的形式发出.

Assembler

汇编器现在支持ARM v8.1中引入的许多原子指令.

gofmt

gofmt (以及带有go fmt )现在可以规范化数字文字前缀和指数以使用小写字母,但不gofmt十六进制数字. 当使用新的八进制前缀( 0O变为0o )时,这会提高可读性,并且重写将始终应用. gofmt现在还从十进制整数虚构文字中删除了不必要的前导零. (为了向后兼容,整数假想字面开始0被认为是一个小数,而不是一个八进制数.卸下多余前导零避免了可能的混淆.)例如, 0B10100XabcDEF0O6601.2E3 ,和01i成为0b10100xabcDEF0o6601.2e31i应用后gofmt .

godoc and go doc

godoc Web服务器不再包含在主要的二进制发行版中. 要在本地运行godoc网络服务器,请先手动安装它:

go get golang.org/x/tools/cmd/godoc
godoc

现在, go doc命令的命令中始终包含package子句,命令除外. 这替代了以前使用启发式的行为,从而导致在某些条件下省略package子句.

Runtime

现在,超出范围的紧急消息包括超出范围的索引和切片的长度(或容量). 例如,长度为1的切片上的s[3]将因"运行时错误:索引超出长度为1的范围[3]"而出现恐慌.

此版本将大多数defer使用的性能提高了30%.

现在,运行时在将内存返回给操作系统以使其可用于联合承租人应用程序方面更具攻击性. 以前,在堆大小达到峰值之后,运行时可以将内存保留五分钟或更长时间. 现在,它将在堆收缩之后立即开始将其返回. 但是,在包括Linux在内的许多操作系统上,该操作系统本身都会延迟回收内存,因此直到系统承受内存压力之前,进程RSS才会减少.

Core library

TLS 1.3

正如Go 1.12中宣布的那样,Go 1.13默认情况下启用了crypto/tls包中对TLS 1.3的支持. 可以通过将值tls13=0添加到GODEBUG环境变量来禁用它. 选择退出将在Go 1.14中删除.

See the Go 1.12 release notes for important compatibility information.

crypto/ed25519

新的crypto/ed25519软件包实现了Ed25519签名方案. 该功能先前由golang.org/x/crypto/ed25519软件包提供,当与Go 1.13+ crypto/ed25519使用时,它将成为crypto/ed25519的包装.

Error wrapping

Go 1.13包含对错误包装的支持,这是在" 错误值"提案中首先提出的,并在相关问题上进行了讨论 .

错误e可以包装另一个错误w通过提供一种Unwrap方法,该方法返回w . ew均可供程序使用,从而允许ew提供附加上下文或重新解释它,同时仍允许程序根据w做出决策.

到支撑包裹, fmt.Errorf现在有一个%w动词用于创建包装的错误,并在三个新函数errors包( errors.Unwraperrors.Iserrors.As )简化解缠和检查包裹错误.

有关更多信息,请阅读errors包文档 ,或参阅" 错误值常见问题解答" . 不久还将有一篇博客文章.

Minor changes to the library

与往常一样,对库的各种微小更改和更新都遵循了Go 1 的兼容性承诺 .

bytes

新的ToValidUTF8函数返回给定字节片的副本,每次运行的无效UTF-8字节序列都由给定片替换.

context

WithValue返回的上下文的格式不再取决于fmt并且不会以相同的方式进行字符串化. 取决于之前的确切字符串化的代码可能会受到影响.

crypto/tls

现在不建议使用 SSL 3.0版(SSLv3) ,它将在Go 1.14中删除 . 请注意,SSLv3是早于TLS的加密破坏协议.

默认情况下,默认情况下始终禁用SSLv3,但在Go 1.12中,默认情况下服务器端错误地启用了SSLv3. 现在默认情况下再次禁用它. (客户端从未支持SSLv3.)

TLS版本1.2和1.3现在支持Ed25519证书.

crypto/x509

现在,根据RFC 8410以及ParsePKCS8PrivateKeyMarshalPKCS8PrivateKeyParsePKIXPublicKey函数,证书和证书请求中支持Ed25519密钥.

现在,搜索系统根目录的路径包括/etc/ssl/cert.pem以支持Alpine Linux 3.7+中的默认位置.

database/sql

NullTime类型代表time.Time可能为空.

新的NullInt32类型表示可能为null的int32 .

debug/dwarf

如果在类型图中遇到未知的DWARF标记,则Data.Type方法不再Data.Type . 相反,它使用UnsupportedType对象表示该类型的组件.

errors

新函数As查找与给定目标的类型匹配的给定错误链中的第一个错误(包装错误的序列),如果是,则将目标设置为该错误值.

新函数Is报告给定的错误值是否与另一个链中的错误匹配.

新函数Unwrap返回给定错误(如果存在)调用Unwrap的结果.

fmt

现在,打印动词%x%X分别以小写和大写形式格式化浮点数和复数,以十六进制表示.

新的打印动词%O以8为基数格式化整数,并发出0o前缀.

扫描程序现在接受十六进制浮点值,数字分隔的下划线以及0b0o前缀. 有关详细信息,请参见语言更改 .

Errorf函数有一个新动词%w ,其操作数必须是错误. 从Errorf返回的错误将具有Unwrap方法,该方法返回%w的操作数.

go/scanner

扫描仪已更新,可以识别新的Go数字文字,特别是带有0b / 0B前缀的二进制文字,带有0o / 0O前缀的八进制文字以及带有十六进制尾数的浮点数. 虚数后缀i现在可以与任何数字文字一起使用,并且下划线可以用作分组的数字分隔符. 有关详细信息,请参见语言更改 .

go/types

类型检查器已更新,以遵循整数移位的新规则. 有关详细信息,请参见语言更改 .

html/template

当使用<script>标记并将" module"设置为type属性时,代码现在将解释为JavaScript module script .

log

新的Writer函数返回标准记录器的输出目标.

math/big

新的Rat.SetUint64方法将Rat设置为uint64值.

对于Float.Parse ,如果base为0,则为了Float.Parse ,可以在数字之间使用下划线. 有关详细信息,请参见语言更改 .

对于Int.SetString ,如果base为0,则为了Int.SetString ,可以在数字之间使用下划线. 有关详细信息,请参见语言更改 .

Rat.SetString现在接受非十进制浮点表示形式.

math/bits

现在保证AddSubMulRotateLeftReverseBytes的执行时间与输入无关.

net

resolv.conf设置use-vc Unix系统上,TCP用于DNS解析.

新字段ListenConfig.KeepAlive指定侦听器接受的网络连接的保持活动时间. 如果此字段为0(默认值),将启用TCP保持活动状态. 要禁用它们,请将其设置为负值.

请注意,在因保持活动超时而关闭的连接上从I / O返回的错误将具有一个Timeout方法,该方法在被调用时将返回true . 这会使保持活动错误难以与由SetDeadline方法和类似方法设置的由于错过最后期限而返回的错误区分开. 使用截止日期并使用Timeout方法或os.IsTimeout进行检查的代码os.IsTimeout可能要禁用保持活动状态或使用错误errors.Is(syscall.ETIMEDOUT) (在Unix系统上)将为保持活动超时返回true如果是最后期限超时,则为false.

net/http

新字段Transport.WriteBufferSizeTransport.ReadBufferSize允许一个指定写的大小和一个用于读取缓冲区Transport . 如果任一字段为零,则使用默认大小4KB.

当提供非零DialDialTLSDialContext函数或TLSClientConfig时,新字段Transport.ForceAttemptHTTP2控制是否启用HTTP / 2.

Transport.MaxConnsPerHost现在可以在HTTP / 2上正常使用.

现在, TimeoutHandlerResponseWriter实现了Pusher接口.

添加了StatusCode 103 "Early Hints" .

Transport现在使用Request.Bodyio.ReaderFrom实现(如果可用)来优化主体编写.

在遇到不受支持的传输编码时, http.Server现在将返回HTTP规范RFC 7230第3.3.1节所要求的" 501未实现"状态.

新的Server字段BaseContextConnContext允许对提供给请求和连接的Context值进行更好的控制.

http.DetectContentType现在可以正确检测RAR签名,并且现在还可以检测RAR v5签名.

新的Header方法Clone返回接收方的副本.

添加了一个新函数NewRequestWithContext ,它接受一个Context来控制所创建的传出Request的整个生存期,适合与Client.DoTransport.RoundTrip .

当服务器使用"408 Request Timeout"响应正常关闭空闲连接时, Transport不再记录错误.

os

新的UserConfigDir函数返回默认目录,以用于特定于用户的配置数据.

如果使用O_APPEND标志打开File ,则其WriteAt方法将始终返回错误.

os/exec

在Windows上,除非Cmd.Env字段Cmd.Env包含显式值,否则Cmd的环境将始终继承父进程的%SYSTEMROOT%值.

reflect

新的Value.IsZero方法报告Value是否为其类型的零值.

The MakeFunc function now allows assignment conversions on returned values, instead of requiring exact type match. This is particularly useful when the type being returned is an interface type, but the value actually returned is a concrete value implementing that type.

runtime

现在,Tracebacks, runtime.Callerruntime.Callers引用了将PKG全局变量初始化为PKG.init而不是PKG.init.ializers .

strconv

对于strconv.ParseFloatstrconv.ParseIntstrconv.ParseUint ,如果base为0,则为了便于阅读,可以在数字之间使用下划线. 有关详细信息,请参见语言更改 .

strings

The new ToValidUTF8 function returns a copy of a given string with each run of invalid UTF-8 byte sequences replaced by a given string.

sync

Mutex.LockMutex.UnlockRWMutex.LockRWMutex.RUnlockOnce.Do的快速路径现在已插入其调用Once.Do . 对于amd64上无可争议的情况,这些更改使" Once.Do次执行"速度Once.Do一倍,而Mutex / RWMutex方法的速度提高了10%.

Large Pool no longer increase stop-the-world pause times.

每个GC之后,不再需要完全重新填充Pool . 现在,它在GC中保留了一些对象,而不是释放所有对象,从而减少了Pool繁重用户的负载峰值.

syscall

_getdirentries64使用已从达尔文版本中删除,以允许Go二进制文件上传到macOS App Store.

Windows已引入ThreadAttributes新的ProcessAttributesThreadAttributes字段, SysProcAttr在创建新进程时公开安全设置.

在Windows上不再以零Chmod模式返回EINVAL .

syscall/js

TypedArrayOf已由CopyBytesToGoCopyBytesToJS取代,用于在字节片和Uint8Array之间复制字节.

testing

在运行基准测试时, BN不再四舍五入.

新方法B.ReportMetric允许用户报告自定义基准指标并覆盖内置指标.

现在,在新的Init函数中注册了测试标志,该函数由生成的用于测试的main函数调用. 结果,现在仅在运行测试二进制文件时注册测试标志,并且调用该flag.Parse程序包.在程序包初始化期间进行flag.Parse可能会导致测试失败.

text/scanner

扫描仪已更新,可以识别新的Go数字文字,特别是带有0b / 0B前缀的二进制文字,带有0o / 0O前缀的八进制文字以及带有十六进制尾数的浮点数. 此外,新的AllowDigitSeparators模式允许数字文字包含下划线作为数字分隔符(默认情况下为向后兼容而关闭). 有关详细信息,请参见语言更改 .

text/template

新的slice函数返回通过以下参数对第一个参数进行切片的结果.

time

现在, FormatParse支持年度日期.

新的Duration方法MicrosecondsMilliseconds返回持续时间,作为其分别命名的单位的整数计数.

unicode

整个系统中的unicode包和相关支持已从Unicode 10.0升级到Unicode 11.0 ,从而增加了684个新字符,其中包括7个新脚本和66个新表情符号.

by  ICOPY.SITE