吉游网提供最新游戏下载和手游攻略!

Golang 1.13发布,尝试新功能

发布时间:2024-09-01浏览:52

语法变化

根据数字文字提案,Go 1.13 支持更统一、更现代的数字语法前缀。

二进制整数:二进制整数文字由前缀0b 或0B 表示,例如0b1011。

八进制整数:八进制整数文字由前缀0o 或0O(前面是数字零,后面是字母o)表示,例如0o660。由前缀0 后跟八进制数字组成的现有八进制表示形式仍然有效。

十六进制浮点数:十六进制格式的浮点数尾数用前缀0x或0X表示,如0x1.0p-1021。十六进制浮点数必须包含指数,用字母p 或P 表示,后跟十进制指数。表示以2 为底的指数幂。

复数:虚数后缀i 可以与任何(二进制、十进制、十六进制)整数或浮点数一起使用。

数字分隔符:您可以使用下划线分隔(分组)任何数字,例如1_000_000、0b_1010_0110 或3.1415_9265。新版本的任意两位数字之间或数字前缀和第一位数字之间可以出现下划线。

根据签名的班次计数提案,Golang 1.13 取消了更改计数必须无签名的限制。此更改可以消除手动uint 转换所需的大量工作,这些工作仅用于满足和运算符的约束。

这些语法更改是通过对编译器的更改以及对内部核心包go/scanner、text/scanner(数字文字)和go/types(有符号整数移位计数)的更改来实现的。

将golang升级到最新版本后,需要在代码和go.mod中指定最新版本才能访问这些更改。这可以直接通过编辑go.mod 文件或运行go mod edit -go=1.13 来实现。

释放端口

Go 1.13 将是支持Native Client (NaCl) 的最后一个版本。对于GOARCH=wasm,新的环境变量GOWASM 采用了逗号分隔二进制编译的实验性功能。

AIX

PPC64 上的新版本AIX (aix/pc64) 支持cgo、外部链接以及c-archive 和pie 构建模式。

安卓

新版本Golang程序兼容Android 10。

达尔文

正如Go 1.12 版本中已经介绍的那样,Go 1.13 需要macOS 10.11 El Capitan 或更高版本,并且已停止对旧版本的支持。

自由BSD

同样,新版本的Go 1.13 需要FreeBSD 11.2 或更高版本,并且已停止对旧版本的支持。 FreeBSD 12.0 或更高版本需要具有COMPAT_FREEBSD11 选项集(默认值)的内核。

伊鲁莫斯

新版本的Go 使用GOOS=illumos 来支持Illumos。 illumos 构建标签也代表Solaris 构建标签。

视窗

新版本中内部链接的Windows 二进制文件指定Windows 版本为Windows 7,支持的最低版本为Window 7,这可能会影响具有向后兼容模式的系统调用的行为。外部链接的二进制文件(使用cgo 的程序)需要指定较新的Windows 版本。

工具链

环境变量

GO111MODULE 默认为自动。如果当前工作目录包含go.mod文件或者是go.mod目录的子目录,则会自动设置激活go命令的模块感知模式,相当于GOPATH/src中的当前目录。这简化了GOPATH/src 中现有代码的迁移以及模块感知包和非模块感知模块引用的维护。

新的GOPRIVATE 环境变量可以配置无法公开发布的私有模块路径。它可用于较低级别的GONOPROXY 和GONOSUMDB 变量的默认值,通过代理提取模块并使用校验和数据库验证它来提供更精细的控制。

GOPROXY 环境变量支持配置为以逗号分隔的代理URL 列表或特殊令牌direct。新版本中的默认值为proxy.golang.org,direct 。当解析包含其模块的包路径时,go 命令将连续尝试列表中每个代理上的所有候选模块路径。如果代理不可达或者返回404、410等状态码,搜索就会终止。这个配置对于国内Golang开发者来说是个好消息。他们可以使用国内的goproxy.io代理,而不必考虑由于网络而无法下载模块的问题。

去env -w GOPROXY=https://goproxy.io,直接

新版本的GOSUMDB 环境变量使用名称、服务器URL 和可选的公钥来通过查询主模块的go.sum 文件中尚未列出的模块的校验和来检查模块。如果GOSUMDB 不包含显式URL,则通过探测GOPROXY URL 来选择URL,该URL 指示支持校验和数据库的端点,如果任何代理不支持,则返回到指定数据库的直接连接。如果GOSUMDB 设置为off,则不会查询校验和数据库,仅验证go.sum 文件中现有的校验和。

由于防火墙或沙箱配置而无法访问默认代理和校验和数据库的实用程序可以通过将GOPROXY 设置为direct 和/或将GOSUMDB 设置为关闭来禁用。还可以通过go env w 命令设置这些变量的默认值:

go env -w GOSUMDB=directgo env -w GOSUMDB=off

去拿

在模块感知模式下,使用go get -u 将新版本更新标记为较小的模块集,这与GOPATH 模式下的go get -u 包更新更加一致。 go get -u 继续更新命令行上命名的模块和包,但只叠加对命名包引入的包的更新,不会更新命名包的模块间接引入的包。

需要注意的是,get get -u(不带附加参数)仅更新当前目录下的包的间接导入的包。要更新主模块引用的所有包(包括测试依赖项),请使用go get -u all。

由于上面对go get -u 的更改,go get 子命令不再支持-m 标志。 -d 标志也受支持,并将下载构建指定包的依赖项所需的源代码。

默认情况下,在模块模式下获取-u 仅升级非测试依赖项,与GOPATH 模式一致。对-t 标志的新支持,用于(在GOPATH 模式下)go get 引入由命令行命名的包的测试引入的包。

在模块感知模式下,新版本的go get 子命令支持版本后缀@patch。 @patch后缀表示指定模块或包含命名包的模块只更新次要版本,主版本和次版本保持不变。例如从v1.2.4升级到v1.2.5

如果没有版本后缀,则默认请求最新版本。这与模块依赖项的-u 标志的行为一致。这可以防止所请求的预发布版本意外降级。以@upgrade 为后缀的新版本明确请求预发布版本。 @latest 明确请求最新版本。

版本验证

当从版本控制系统中提取模块时,go 命令new version 对请求的版本字符串执行额外的验证。

+不兼容版本注释在导入模块之前绕过了存储库语义版本控制的要求。 go 命令新版本验证此类版本不包含显式go.mod 文件。

go 命令行验证伪版本和版本元数据之间的映射:

版本前缀必须采用vX.0.0 形式,要么源自指定命名版本的祖先上的标签,要么源自包含命名版本本身的构建元数据的标签。

日期字符串必须与版本的UTC 时间戳匹配。

版本的短名称必须使用与go 命令生成的相同数量的字符。 (对于git 版本,SHA-1 哈希值,前12 位。)

如果主模块中的require 指令使用无效的伪版本,通常可以通过将版本重写为提交哈希然后重新运行go 命令来纠正。例如go list -m all 或go mod tidy。例如,

需要github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c

可以编辑为

需要github.com/docker/docker e7b5f7dbe98c

如果主模块的依赖项之一是无效版本或假版本,您可以使用主模块的go.mod 文件中的Replace 指令将无效版本替换为有效版本。如果替换时提交了哈希,它将被解析为适当的伪版本,如上所述。例如

替换github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c=github.com/docker/docker e7b5f7dbe98c

将被解析为

替换github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c=github.com/docker/docker v0.7.3-0.20190319215453-e7b5f7dbe98c

进入命令行

go env 命令使用-w 标志来设置用户的默认环境变量,使用-u 标志来取消之前设置的默认值。 go env -w 设置的默认值存储在os.UserConfigDir() 目录下的go/env 文件中。

go version 命令接受可执行文件和目录作为参数。当在可执行文件上调用该命令时,go version 会打印构建可执行文件所用的Go 版本。如果使用-m 标志,go version 会打印可执行文件的嵌入模块版本信息)。当在目录上调用时,go version 会打印有关该目录及其子目录中包含的可执行文件的信息。

Go build 添加了一个新的-trimpath 标志,用于从已编译的可执行文件中删除所有文件系统路径,以提高构建的可重复性。如果传递给go build 的-o 标志引用现有目录,则go build 在该目录中生成与其包参数匹配的主包可执行文件。

go build flags -tags 更新为使用逗号分隔的构建标签列表来支持GOFLAGS 中的多个标签。空格分隔的语法已被弃用,但仍然被识别和维护。

gogenerate 设置generate构建标签,该标签可用于搜索文件中的指令,但在构建过程中忽略它们。

正如Go 1.12 版本中已经提到的,1.13 版本不再支持纯二进制包。构建纯二进制包(用//go:binary-only-package 注释标记)会引发错误。

编译器

编译器添加了更精确的逃逸分析实现。对于大多数Go 代码来说应该是一个改进(换句话说,更多的Go 变量和表达式分配在堆栈上而不是堆上)。然而,这种改进的精度实现也可能会导致一些以前可以运行的无效代码(例如,违反unsafe.Pointer 安全规则的代码)。如果有类似代码,暂时可用

go build -gcflags=all=-newescape=false 重新启用旧的逃逸分析过程。使用旧逃逸分析的选项将在未来版本中完全删除。

编译器不再将浮点或复杂常量传递给go_asm.h 文件。它们始终作为数字常量传递,不能在汇编代码中传递。

汇编

新版本的汇编器支持ARM v8.1 中引入的许多原子指令。

戈夫姆特

gofmt (go fmt) 新版本将数字前缀和指数标准化为使用小写字母,但仅保留十六进制数字。这提高了使用新的八进制前缀(0O 变为0o)以及一致应用重写时的可读性。新版本的gofmt 还从十进制整数虚数中删除了不必要的前导零。 (为了向后兼容,从0 开始的整数虚数被视为十进制,而不是八进制。删除多余的前导零可以避免潜在的混乱。)

例如,0B1010、0XabcDEF、0O660、1.2E3 和01i 变为:

0b1010、0xabcDEF、0o660、1.2e3 和1i

戈多克和戈多克

godoc webserver 已从主要二进制分发包中删除。您需要在本地运行godoc webserver,请先手动安装:

去获取golang.org/x/tools/cmd/godocgodoc

除了go doc 命令之外,新版本在其输出中始终包含package 子句。这取代了以前使用启发式的行为,导致在某些条件下省略包子句。

运行时

新版本的超出范围紧急错误消息包括超出范围的索引和切片的长度(或容量)。例如:

长度为1 的切片上的s[3] 会因“运行时错误:索引超出长度为1 的范围[3]”而发生恐慌。

新版本将大多数defer 的性能提高了30%。

新的运行时在将内存返回给操作系统方面更加积极,以使其可供共同租户应用程序使用。以前,在堆大小增加后,运行时可能会保留内存五分钟或更长时间。新版本将在堆收缩后立即开始返回堆。然而,在许多操作系统(包括Linux)上,操作系统本身会延迟回收内存,因此进程RSS直到系统面临内存压力时才会减少。

核心库更新

传输层安全协议1.3

Go 1.13 默认通过crypto/tls 包启用TLS 1.3。可以通过将值tls13=0 添加到GODEBUG 环境变量来禁用此默认行为。这个临时禁止选项将在Go 1.14 中删除。

加密/ed25519

新的crypto/ed25519 包实现了Ed25519 签名方案。该功能之前由golang.org/x/crypto/ed25519 包提供,在1.13 版本之后被打包为crypto/ed25519 包装器。

包装错误

Go 1.13 包括错误值提案以及相关问题中讨论的一些错误功能的包装。

错误e 可以通过提供返回w 的Unwrap 方法来包装另一个错误w。 e 和w 都可以在程序中使用,允许e 为w 提供额外的上下文或重新解释它,同时仍然允许程序根据w 做出决策。

为了支持打包的fmt.Errorf,新版本有一个%w 动词用于创建打包错误,并且错误包中的三个新函数(errors.Unwrap、errors.Is 和error.As)简化了打包错误的展开和检查。

其他库更改

与每个版本一样,11.3 版本也对各种库带来了各种细微的更改和更新,并坚持与Go 1 的兼容性

字节

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

语境

WithValue 返回的上下文格式不再依赖于fmt,也不再以相同的方式进行字符串化。依赖于先前字符串化的代码可能会受到影响。

加密/tls

对SSL 版本3.0 (SSLv3) 的支持现已弃用,并将在Go 1.14 中删除。

当默认服务器端错误启用SSLv3 时,SSLv3 始终默认处于禁用状态。 (客户端从不支持SSLv3。)

TLS 1.2 版和1.3 新版本支持Ed25519 证书。

加密/x509

根据RFC 8410,在身份验证和身份验证请求中支持Ed25519 密钥。还同时支持ParsePKCS8PrivateKey、MarshalPKCS8PrivateKey 和ParsePKIXPublicKey 函数。

新版本的系统根搜索路径包括/etc/ssl/cert.pem,以支持Alpine Linux 3.7+中的默认路径。

数据库/sql

新的NullTime 类型指示time.Time 可能为null。

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

调试/矮化

如果在类型图中遇到未知的DWARF 标记,Data.Type 方法不再出现恐慌。相反,它表示为具有UnsupportedType 对象的类型的组件。

错误

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

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

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

FMMT

print 中的谓词动词%x 和%X 表示格式化浮点数和小写和大写的复数。

新打印中的谓词%O 表示一个八进制整数

新版本的扫描器接受十六进制浮点值,数字之间用下划线和0b和0o前缀分隔。

Errorf 函数添加了一个新谓词%w,其操作数必须是错误。 Errorf 返回的错误对象支持Unwrap 方法,该方法返回%w 的操作数。

去/扫描仪

扫描仪程序已更新,可以识别新的Go 数字格式,特别是带有0b/0B 前缀的二进制数、带有0o/0O 前缀的八进制数以及带有十六进制尾数的浮点数。复数后缀i的虚部支持与任何数字一起使用,下划线可以用作分组的数字分隔符。

去/类型

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

html/模板

使用时

日志

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

数学/大

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

对于Float.Parse,如果基数为0,可以在数字之间使用下划线以提高可读性。

对于Int.SetString,如果基数为0,可以在数字之间使用下划线以提高可读性。

新版本的Rat.SetString 接受非十进制浮点表示。

数学/位

现在,Add、Sub、Mul、RotateLeft 和ReverseBytes 的执行时间保证与输入无关。

在Unix 系统上,use-vc 设置位于resolv.conf 中,DNS 解析使用TCP 协议。

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

网络/http

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

新字段Transport.ForceAttemptHTTP2 控制在提供非零Dial、DialTLS 或DialContext 函数或TLSClientConfig 时是否启用HTTP/2。

Transport.MaxConnsPerHost 在新版本中可以与HTTP/2 正常工作。

TimeoutHandler的ResponseWriter在新版本中实现了Pusher和Flusher接口。

添加了状态代码103“早期提示”。

Transport 在新版本中使用Request.Body 的io.ReaderFrom 实现(如果可用)来优化正文的写入。

当遇到不支持的传输编码时,http.Server 将返回新版本中HTTP 规范RFC 7230 第3.3.1 节中指定的“501 Not Implemented”状态。

新的服务器字段BaseContext 和ConnContext 允许更好地控制提供给请求和连接的Context 值。

http.DetectContentType在新版本中可以正确检测RAR签名,也可以检测RAR v5签名。

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

添加了新函数NewRequestWithContext,它接受Context 来控制所创建的传出请求的整个生命周期,适用于Client.Do 和Transport.RoundTrip。

当服务器通过“408 请求超时”响应正常关闭空闲连接时,传输不再记录错误。

操作系统

新的UserConfigDir 函数返回用户特定配置数据的默认目录。

操作系统/执行

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

反映

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

新版本的MakeFunc函数允许对返回值进行赋值转换,而不需要精确的类型匹配。当返回的类型是接口类型,但实际返回的值是实现该类型的具体值时,这特别有用。

运行时

新版本的Tracebacks、runtime.Caller和runtime.Callers指的是初始化PKG的全局变量为PKG.init而不是PKG.init.ializers的函数。

字符串转换

对于strconv.ParseFloat、strconv.ParseInt和strconv.ParseUint,如果base为0,可以在数字之间使用下划线以提高可读性。

字符串

新的ToValidUTF8 函数返回给定字符串的副本,并在每次运行时将无效的UTF-8 字节序列替换为给定字符串。

同步

新版本中,Mutex.Lock、Mutex.Unlock、RWMutex.Lock、RWMutex.RUnlock 和Once.Do 的快速路径内联在调用方中。对于amd64 上的无竞争情况,这些更改使Once.Do 的速度提高了一倍,并且Mutex/RWMutex 方法的速度提高了10%。

大型程序池不再增加停止世界的暂停时间。

程序池不再需要在每次GC 后完全重新填充。它的新版本在GC 中保留了一些对象,而不是释放所有对象,从而减少了大量用户的负载峰值。

系统调用

_getdirentries64 的使用已从Darwin 版本中删除,以允许将Go 二进制文件上传到macOS App Store。

SysProcAttr 中的新ProcessAttributes 和ThreadAttributes 字段已针对Windows 引入,在创建新进程时公开安全设置。

在Windows 上,在零Chmod 模式下不再返回EINVAL。

系统调用/js

测试

运行基准测试时,B.N 不再四舍五入。

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

新版本的测试标志注册在新的Init 函数中,该函数由生成的测试主函数调用。因此,新版本仅在运行测试二进制文件时注册测试标志,在包初始化期间调用flag.Parse的包可能会导致测试失败。

文本/扫描仪

扫描仪程序已更新,可以识别新的Go 号码格式。

文本/模板

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

时间

新版本的格式和解析支持日期。

新的持续时间方法微秒和毫秒以各自命名单位的整数计数形式返回持续时间。

统一码

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

用户评论

tina

这个 Golang 1.13 太酷了!赶快下载体验一下新功能吧!

    有8位网友表示赞同!

旧爱剩女

最近一直在学习Golang,1.13 的更新真是太棒了,可以提升效率不少。

    有9位网友表示赞同!

←极§速

终于等到了 1.13 版本! 新功能试玩了一下,感觉还不错!

    有16位网友表示赞同!

哭花了素颜

对 Golang 新功能一直很期待,尤其这次的改进点很有用!

    有12位网友表示赞同!

迷路的男人

看下论坛上Golang 社区都很热烈,这个新版本火爆了!

    有18位网友表示赞同!

十言i

学习编程的新工具,从 Golang 1.13 开始!

    有8位网友表示赞同!

凉话刺骨

升级到 Golang 1.13 之后,项目运行更流畅了。

    有12位网友表示赞同!

琴断朱弦

这几次更新简直是迭代神作,Golang 越来越强了。

    有12位网友表示赞同!

雁過藍天

一直在用 Golang 开发,这次新版本的功能提升让我很惊喜!

    有19位网友表示赞同!

心已麻木i

这个消息真棒!刚好准备开始一个新的 Golang 项目。

    有16位网友表示赞同!

不识爱人心

1.13 的更新让 Golang 更强大了吗? 很好奇要试试看!

    有14位网友表示赞同!

挽手余生ら

之前遇到一些 Golang 的问题,希望这次更新能解决掉!

    有11位网友表示赞同!

花容月貌

作为一名 Golang 开发者,这个更新简直是我的福利!

    有5位网友表示赞同!

来自火星球的我

对新版本的测试结果如何?感觉好用吗 ?

    有13位网友表示赞同!

抚笙

这几个新功能可以提升代码效率吗?

    有7位网友表示赞同!

水波映月

期待能看到更多关于Golang 1.13 的教程和案例!

    有15位网友表示赞同!

漫长の人生

更新之后,是否有任何变化需要注意吗?

    有14位网友表示赞同!

白恍

对于 Golang 新手来说,这个更新会有哪些帮助?

    有8位网友表示赞同!

把孤独喂饱

感觉 Golang 的未来发展越来越好!

    有7位网友表示赞同!

热点资讯