Go最新版下载 Go1.20版新特性
Go官方正式发布了Go1.20稳定版
该版本依然保持 Go1 兼容性,可以升级到 Go1.20,而不需要做任何代码改动。
可以使用你任何喜欢的方式升级:
比如:
go install golang.org/dl/go1.20@latest
具体的可以参考官网教程:
https://go.dev/doc/go1.20
或者关注我:
一起学习
欢迎在CSDN私信我,也欢迎 加我好友 一起学习
Go 1.20 简介
最新的 Go 版本 1.20 在Go 1.19 发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。
一如既往,该版本保持了 Go 1的兼容性承诺。我们期望几乎所有的 Go 程序都能像以前一样继续编译和运行。
内容很长,建议先收藏,再转发给gopher小伙伴们,慢慢看。
语言的变化
Go 1.20 包括对语言的四个更改。
Go 1.17 添加了从切片到数组指针的转换。Go 1.20 扩展了它以允许从切片到数组的转换:给定一个切片x
,[4]byte(x)
现在可以写成*(*[4]byte)(x)
.
该unsafe
包定义了三个新函数SliceData
、String
和StringData
。与 Go 1.17 一起Slice
,这些函数现在提供了构建和解构切片和字符串值的完整能力,而不依赖于它们的确切表示。
该规范现在定义结构值一次比较一个字段,按照它们在结构类型定义中出现的顺序考虑字段,并在第一个不匹配时停止。之前可以阅读规范,就好像所有字段都需要比较第一个不匹配之外的字段。类似地,该规范现在定义数组值按递增索引顺序一次比较一个元素。在这两种情况下,差异会影响某些比较是否必须恐慌。现有程序没有改变:新的规范措辞描述了实现一直所做的事情。
可比较的类型(例如普通接口)现在可以满足comparable
约束,即使类型参数不是严格可比较的(比较可能会在运行时崩溃)。这使得实例化受约束的类型参数comparable
(例如,用户定义的通用映射键的类型参数)与非严格可比较的类型参数(例如接口类型或包含接口类型的复合类型)成为可能。
端口
Windows
Go 1.20 是将在 Windows 7、8、Server 2008 和 Server 2012 的任何版本上运行的最后一个版本。Go 1.21 将至少需要 Windows 10 或 Server 2016。
Darwin and iOS
Go 1.20 是将在 macOS 10.13 High Sierra 或 10.14 Mojave 上运行的最后一个版本。Go 1.21 将需要 macOS 10.15 Catalina 或更高版本。
FreeBSD/RISC-V
GOOS=freebsd
Go 1.20 在 RISC-V ( , GOARCH=riscv64
) 上添加了对 FreeBSD 的实验性支持。
工具
Go command
该目录$GOROOT/pkg
不再存储标准库的预编译包存档: go
install
不再写入它们,go
构建不再检查它们,Go 发行版不再运送它们。相反,标准库中的包是根据需要构建的,并缓存在构建缓存中,就像外部的包一样GOROOT
。此更改减少了 Go 发行版的大小,还避免了使用 cgo 的包的 C 工具链倾斜。
实施go
test
-json
已得到改进,使其更加健壮。运行的程序go
test
-json
不需要任何更新。直接调用的程序现在应该使用 (例如, 或)而不是普通的来go
tool
test2json
运行测试二进制文件。 -v=test2json``go
test
-v=test2json``./pkg.test
-test.v=test2json``-v
一个相关的变化是 在每个测试程序开始执行时go
test
-json
添加了一个Action
设置为的事件。start
当使用命令运行多个测试时go
,这些启动事件保证以与命令行中指定的包相同的顺序发出。
该go
命令现在定义了体系结构功能构建标签,例如amd64.v2
,以允许根据特定体系结构功能的存在或不存在来选择包实现文件。详情请见go
help
buildconstraint
。
go
子命令现在接受 在执行命令之前 将-C
<dir>
目录更改为 <dir>
,这对于需要在多个不同模块中执行命令的脚本可能很有用。
go
build
andgo
test
命令不再接受-i
标志,该标志自 Go 1.16 以来已 被弃用。
该go
generate
命令现在接受 -skip
<pattern>
跳过//go:generate
匹配的指令<pattern>
。
该go
test
命令现在接受 -skip
<pattern>
跳过测试、子测试或匹配的示例<pattern>
。
当主模块位于 中GOPATH/src
时, go
install
不再为非main
包安装库GOPATH/pkg
,并且go
list
不再报告Target
此类包的字段。(在模块模式下,已编译的包仅存储在 构建缓存中 ,但一个错误导致GOPATH
安装目标意外地保持有效。)
go
build
和go
install
其他与构建相关的命令现在支持-pgo
启用配置文件引导优化的标志,这在下面的 编译器部分中有更详细的描述。该-pgo
标志指定配置文件的文件路径。指定-pgo=auto
会导致go
命令搜索default.pgo
在主包目录中命名的文件,如果存在则使用它。此模式目前需要在命令行上指定一个主包,但我们计划在未来的版本中取消此限制。指定-pgo=off
关闭配置文件引导的优化。
go
build
和go
install
其他与构建相关的命令现在支持-cover
使用代码覆盖检测构建指定目标的标志。这在下面的封面部分 中有更详细的描述 。
go
version
该go
version
-m
命令现在支持读取更多类型的 Go 二进制文件,最值得注意的是,使用构建的 Windows DLLgo
build
-buildmode=c-shared
和没有执行权限的 Linux 二进制文件。
CGO
该go
命令现在默认在没有 C 工具链的系统上禁用cgo
。更具体地说,当CGO_ENABLED
环境变量未设置时,环境变量未设置,并且在路径中找不到 CC
默认的 C 编译器(通常是clang
或),默认为. 与往常一样,您可以通过显式设置来覆盖默认值。 gcc``CGO_ENABLED``0``CGO_ENABLED
默认更改最重要的影响是,当 Go 安装在没有 C 编译器的系统上时,它现在将使用纯 Go 构建标准库中使用 cgo 的包,而不是使用预分发的包存档(有已被删除,如上所述)或尝试使用 cgo 并失败。这使得 Go 在一些最小的容器环境以及 macOS 上工作得更好,在 macOS 上,自 Go 1.16 以来,预分发的包存档还没有用于基于 cgo 的包。
标准库中使用 cgo 的包有net
、 os/user
和 plugin
。在 macOS 上,net
和os/user
包已被重写为不使用 cgo:相同的代码现在用于 cgo 和非 cgo 构建以及交叉编译的构建。在 Windows 上,net
和os/user
包从未使用过 cgo。在其他系统上,禁用 cgo 的构建将使用这些包的纯 Go 版本。
在 macOS 上,竞态检测器已被重写为不使用 cgo:启用竞态检测器的程序可以在没有 Xcode 的情况下构建和运行。在 Linux 和其他 Unix 系统以及 Windows 上,需要主机 C 工具链才能使用竞争检测器。
Cover
Go 1.20 支持收集程序(应用程序和集成测试)的代码覆盖率配置文件,而不仅仅是单元测试。
要收集程序的覆盖率数据,请使用go
build
的-cover
标志构建它,然后运行生成的二进制文件,并将环境变量GOCOVERDIR
设置为覆盖率配置文件的输出目录。有关如何开始的更多信息,请参阅 “集成测试覆盖率”登录页面。详细设计和实现见 提案。
Vet
改进了嵌套函数对循环变量捕获的检测
该工具现在报告 在子测试函数体内vet
调用后对循环变量的引用。T.Parallel()
此类引用可能会观察来自不同迭代的变量值(通常会导致测试用例被跳过)或由于不同步的并发访问而导致的无效状态。
该工具还在更多地方检测引用错误。以前它只会考虑循环体的最后一条语句,但现在它递归地检查 if、switch 和 select 语句中的最后一条语句。
针对错误时间格式的新诊断
vet 工具现在报告使用时间格式 2006-02-01 (yyyy-dd-mm)Time.Format
和 time.Parse
。此格式未出现在通用日期标准中,但在尝试使用 ISO 8601 日期格式 (yyyy-mm-dd) 时经常被错误使用。
Runtime
一些垃圾收集器的内部数据结构被重新组织,以提高空间和 CPU 效率。此更改减少了内存开销并将整体 CPU 性能提高了 2%。
在某些情况下,垃圾收集器在 goroutine 协助方面表现得不太不稳定。
Go 1.20 添加了一个runtime/coverage
包含 API 的新包,用于在运行时从长时间运行和/或不通过os.Exit()
.
编译器 Compiler
Go 1.20 添加了对配置文件引导优化 (PGO) 的预览支持。PGO 使工具链能够根据运行时配置文件信息执行特定于应用程序和工作负载的优化。目前,编译器支持 pprof CPU 配置文件,可以通过常规方式收集,例如runtime/pprof
或 net/http/pprof
包。要启用 PGO,请通过 -pgo
标志将 pprof 配置文件的路径传递给go
build
,如上所述。Go 1.20 使用 PGO 更积极地在热调用站点内联函数。一组具有代表性的 Go 程序的基准显示启用配置文件引导的内联优化可将性能提高约 3–4%。请参阅PGO 用户指南获取详细文档。我们计划在未来的版本中添加更多配置文件引导的优化。请注意,配置文件引导的优化是一个预览,因此请谨慎使用。
Go 1.20 编译器升级了它的前端以使用一种新的方式来处理编译器的内部数据,它修复了几个泛型类型问题并在泛型函数和方法中启用了类型声明。
编译器现在 默认拒绝带有编译器错误的匿名接口循环。这些源于嵌入式接口的巧妙使用, 并且一直存在细微的正确性问题,但我们没有证据表明它们确实在实践中使用过。假设没有用户报告受到此更改的不利影响,我们计划更新 Go 1.22 的语言规范以正式禁止它们,以便工具作者也可以停止支持它们。
Go 1.18 和 1.19 的构建速度有所下降,这主要是由于增加了对泛型的支持和后续工作。Go 1.20 将构建速度提高了 10%,使其与 Go 1.17 保持一致。相对于 Go 1.19,生成的代码性能也普遍略有提升。
链接器 Linker
glibc
在 Linux 上,链接器现在为链接时或musl
在链接时 选择动态解释器。
在 Windows 上,Go 链接器现在支持现代的基于 LLVM 的 C 工具链。
Go 1.20 对编译器生成的符号使用go:
andtype:
前缀,而不是go.
and type.
。这避免了名称以 . 开头的用户包的混淆go.
。该debug/gosym
软件包理解使用 Go 1.20 及更新版本构建的二进制文件的新命名约定。
引导程序 Bootstrap
当从源代码构建 Go 版本GOROOT_BOOTSTRAP
且未设置时,以前版本的 Go 在目录中查找 Go 1.4 或更高版本的引导工具链 $HOME/go1.4
(%HOMEDRIVE%%HOMEPATH%\go1.4
在 Windows 上)。 Go 1.18 和 Go 1.19在回退到 之前首先寻找$HOME/go1.17
或,以预期在引导 Go 1.20 时需要使用 Go 1.17。Go 1.20 确实需要 Go 1.17 版本来进行引导,但我们意识到我们应该采用引导工具链的最新点版本,因此它需要 Go 1.17.13。Go 1.20 寻找或 回退到之前$HOME/sdk/go1.17``$HOME/go1.4``$HOME/go1.17.13``$HOME/sdk/go1.17.13``$HOME/go1.4
(以支持硬编码路径 $HOME/go1.4 但在那里安装了更新的 Go 工具链的系统)。未来,我们计划大约每年将引导工具链向前移动一次,特别是我们预计 Go 1.22 将需要 Go 1.20 的最终版本来进行引导。
核心库
New crypto/ecdh package
Go 1.20 添加了一个新crypto/ecdh
包,以明确支持 NIST 曲线和 Curve25519 上的椭圆曲线 Diffie-Hellman 密钥交换。
程序应该为 ECDH 使用crypto/ecdh
而不是低级功能 crypto/elliptic
,而为更高级的用例使用第三方模块。
包装多个错误
Go 1.20 扩展了对错误包装的支持,允许一个错误包装多个其他错误。
一个错误e
可以通过提供一个Unwrap
返回[]error
.
和函数已更新以检查多重包装错误 errors.Is
。 errors.As
该fmt.Errorf
函数现在支持多次出现%w
格式动词,这将导致它返回一个包含所有这些错误操作数的错误。
新函数errors.Join
返回一个包含错误列表的错误。
HTTP 响应控制器
新 "net/http".ResponseController
类型提供对接口未处理的扩展的按请求功能的 "net/http".ResponseWriter
访问。
以前,我们通过定义ResponseWriter
可以实现的可选接口(例如 Flusher
. 这些接口不可发现且使用起来很笨拙。
该ResponseController
类型提供了一种更清晰、更易于发现的方式来添加每个处理程序的控件。Go 1.20 中还添加了两个这样的控件是 SetReadDeadline
和SetWriteDeadline
,它们允许设置每个请求的读写截止日期。例如:
func RequestHandler(w ResponseWriter, r *Request) {rc := http.NewResponseController(w)rc.SetWriteDeadline(time.Time{}) // 发送大响应时禁用 Server.WriteTimeoutio.Copy(w, 大数据)
}
新的 ReverseProxy 重写hook
httputil.ReverseProxy
转发代理包括一个新的 钩子Rewrite
函数,取代了以前的Director
钩子。
该Rewrite
挂钩接受一个 ProxyRequest
参数,该参数包括代理接收的入站请求和它将发送的出站请求。与Director
仅对出站请求进行操作的挂钩不同,这允许Rewrite
挂钩避免某些情况,在这些情况下,恶意入站请求可能导致挂钩添加的标头在转发之前被删除。请参阅问题 #50580。
该ProxyRequest.SetURL
方法将出站请求路由到提供的目的地并取代该NewSingleHostReverseProxy
功能。与 不同的NewSingleHostReverseProxy
是,SetURL
还设置了Host
出站请求的标头。
该 ProxyRequest.SetXForwarded
方法设置出站请求的X-Forwarded-For
、X-Forwarded-Host
和X-Forwarded-Proto
标头。使用 aRewrite
时,默认情况下不会添加这些标头。
Rewrite
使用这些功能的挂钩 示例是:
proxyHandler := &httputil.ReverseProxy{重写: func(r *httputil.ProxyRequest) {r.SetURL(outboundURL) // 转发请求到 outboundURL。r.SetXForwarded() // 设置 X-Forwarded-* 标头。r.Out.Header.Set("X-Additional-Header", "代理设置的header")},
}
ReverseProxy
User-Agent
当传入请求没有时, 不再向转发的请求添加标头。
library的小改动
与往常一样,库有各种小的变化和更新,考虑到 Go 1的兼容性承诺 。还有各种性能提升,这里就不一一列举了。
-
archive/tar
设置
GODEBUG=tarinsecurepath=0
环境变量后,Reader.Next
方法现在将返回ErrInsecurePath
文件名为绝对路径的条目的错误,指的是当前目录之外的位置,包含无效字符,或者(在 Windows 上)是保留名称,例如NUL
. Go 的未来版本可能会默认禁用不安全的路径。
-
archive/zip
设置
GODEBUG=zipinsecurepath=0
环境变量后,NewReader
现在将ErrInsecurePath
在打开包含绝对路径的任何文件名的存档时返回错误,指的是当前目录之外的位置,包含无效字符,或者(在 Windows 上)是保留名称,例如作为NUL
。Go 的未来版本可能会默认禁用不安全的路径。从包含文件数据的目录文件中读取现在将返回错误。zip 规范不允许目录文件包含文件数据,因此此更改仅影响从无效存档中读取。
-
bytes
新的
CutPrefix
andCutSuffix
函数与 and 类似TrimPrefix
,TrimSuffix
但也报告字符串是否被修剪。新
Clone
函数分配字节切片的副本。
-
context
新
WithCancelCause
函数提供了一种方法来取消具有给定错误的上下文。可以通过调用新Cause
函数来检索该错误。
-
crypto/ecdsa
使用支持的曲线时,所有操作现在都在恒定时间内实现。这导致 CPU 时间增加 5% 到 30%,主要影响 P-384 和 P-521。
新
PrivateKey.ECDH
方法将 an 转换ecdsa.PrivateKey
为ecdh.PrivateKey
.
-
crypto/ed25519
该
PrivateKey.Sign
方法和VerifyWithOptions
函数现在支持使用 Ed25519ph 对预散列消息进行签名,由Options.HashFunc
返回crypto.SHA512
. 他们现在还支持带有上下文的 Ed25519ctx 和 Ed25519ph,通过设置新Options.Context
字段来指示。
-
crypto/RSA
新字段
OAEPOptions.MGFHash
允许为 OAEP 解密单独配置 MGF1 哈希。crypto/rsa 现在使用一个新的、更安全的、恒定时间的后端。这会导致解密操作的 CPU 运行时间增加大约 15%(amd64 上的 RSA-2048)和 45%(arm64 上的 RSA-4096),在 32 位架构上更多。加密操作比以前慢了大约 20 倍(但仍然比解密快 5-10 倍)。性能有望在未来的版本中得到改善。程序不得修改或手动生成 的字段
PrecomputedValues
。
-
crypto/subtle
新函数
XORBytes
将两个字节片异或在一起。
-
crypto/TLS
已解析的证书现在在所有主动使用该证书的客户端之间共享。在与共享其证书链的任何部分的服务器或服务器集合建立许多并发连接的程序中,内存节省可能非常重要。
对于由于证书验证失败而导致的握手失败,TLS 客户端和服务器现在返回一个新类型的错误
CertificateVerificationError
,其中包括提供的证书。
-
crypto/x509
ParsePKCS8PrivateKey
现在MarshalPKCS8PrivateKey
支持类型的键*crypto/ecdh.PrivateKey
。ParsePKIXPublicKey
现在MarshalPKIXPublicKey
支持类型的键*crypto/ecdh.PublicKey
。解析 NIST 曲线键仍然返回类型*ecdsa.PublicKey
和的值*ecdsa.PrivateKey
。使用他们的新ECDH
方法转换为crypto/ecdh
类型。新
SetFallbackRoots
功能允许程序定义一组备用根证书,以防操作系统验证程序或标准平台根包在运行时不可用。它最常与新包golang.org/x/crypto/x509roots/fallback一起使用,它将提供最新的根包。
-
debug/elf
尝试使用现在返回 的读取器或读取器读取
SHT_NOBITS
部分 会 返回错误。Section.Data
Section.Open
定义了其他
R_LARCH_*
常量以用于 LoongArch 系统。定义了其他
R_PPC64_*
常量以用于 PPC64 ELFv2 重定位。的常量值
R_PPC64_SECTOFF_LO_DS
已从 61 更正为 62。
-
debug/gosym
由于Go 的符号命名约定发生了变化,处理 Go 二进制文件的工具应该使用 Go 1.20 的
debug/gosym
包来透明地处理新旧二进制文件。
-
debug/PE
定义了其他
IMAGE_FILE_MACHINE_RISCV*
常量以用于 RISC-V 系统。
-
编码/二进制
ReadVarint
和ReadUvarint
函数现在将 在io.ErrUnexpectedEOF
读取部分值后返回,而不是io.EOF
.
-
encoding/xml
新
Encoder.Close
方法可用于在完成编码时检查未闭合的元素。解码器现在拒绝具有多个冒号的元素和属性名称,例如
<a:b:c>
,以及解析为空字符串的命名空间,例如xmlns:a=""
.解码器现在拒绝在开始和结束标记中使用不同命名空间前缀的元素,即使这些前缀都表示相同的命名空间。
-
错误
新
Join
函数返回一个包含错误列表的错误。
-
调速器
该
Errorf
函数支持格式动词的多次出现%w
,返回一个错误,该错误解包到所有参数的列表%w
。新
FormatString
函数恢复对应于 a 的格式化指令State
,这在Formatter
. 实施。
-
go/ast
新
RangeStmt.Range
字段记录range
关键字在范围语句中的位置。新增的
File.FileStart
andFile.FileEnd
字段记录了整个源文件的开始和结束位置。
-
go/token令牌
新
FileSet.RemoveFile
方法从FileSet
. 长时间运行的程序可以使用它来释放与它们不再需要的文件关联的内存。
-
go/types
新
Satisfies
函数报告类型是否满足约束。 此更改与区分满足约束和实现接口 的新语言语义一致。
-
IO
新
OffsetWriter
包装底层WriterAt
并提供Seek
、Write
和WriteAt
方法,将其有效文件偏移位置调整固定量。
-
读写器
新错误 立即但成功
SkipAll
终止。WalkDir
-
math/big
math/big包 的广泛范围和依赖于输入的时序使其不适合实现密码学。标准库中的加密包不再 对攻击者控制的输入调用非平凡的Int方法。将来,确定 math/big 中的错误是否被视为安全漏洞将取决于它对标准库的更广泛影响。
-
math/rand
math/rand包 现在自动为全局随机数生成器(由 和 等顶级函数使用
Float64
)Int
生成一个随机值,并且顶级Seed
函数已被弃用。需要可重现的随机数序列的程序应该更喜欢分配自己的随机源,使用rand.New(rand.NewSource(seed))
.需要较早一致的全局播种行为的程序可以
GODEBUG=randautoseed=0
在其环境中设置。顶层
Read
函数已被弃用。几乎在所有情况下,crypto/rand.Read
都是更合适的。
-
mime
该
ParseMediaType
函数现在允许重复参数名称,只要名称的值相同即可。
-
mime/multipart
该
Reader
类型的方法现在包装了底层返回的错误io.Reader
。
-
net
该函数现在在记录存在时
LookupCNAME
始终如一地返回记录的内容。CNAME
以前在 Unix 系统上,当使用纯 Go 解析器时,如果记录引用的名称没有、 或记录,LookupCNAME
则会返回错误。此更改会修改 以匹配 Windows 上的先前行为,从而允许在存在时成功 。CNAME``A``AAAA``CNAME``LookupCNAME``LookupCNAME``CNAME
Interface.Flags
现在包括新标志FlagRunning
,表示一个可操作的活动接口。管理配置但不活动的接口(例如,因为未连接网络电缆)将FlagUp
设置但不FlagRunning
。新
Dialer.ControlContext
字段包含一个类似于现有Dialer.Control
挂钩的回调函数,它另外接受拨号上下文作为参数。 当不为零Control
时被忽略。ControlContext
Go DNS 解析器识别
trust-ad
解析器选项。当在options trust-ad
中设置时resolv.conf
,Go 解析器将在 DNS 查询中设置 AD 位。解析器不在响应中使用 AD 位。DNS 解析将检测更改
/etc/nsswitch.conf
并在更改时重新加载文件。最多每五秒进行一次检查,与之前对/etc/hosts
和的处理相匹配/etc/resolv.conf
。
-
网络/http
该
ResponseWriter.WriteHeader
功能现在支持发送1xx
状态代码。新的
Server.DisableGeneralOptionsHandler
配置设置允许禁用默认OPTIONS *
处理程序。当从代理接收到请求的 HTTP 响应
Transport.OnProxyConnectResponse
时,将调用 新挂钩。Transport``CONNECT
HTTP 服务器现在接受包含正文的 HEAD 请求,而不是将它们视为无效而拒绝。
函数返回的 HTTP/2 流错误
net/http
可能会转换为golang.org/x/net/http2.StreamError
使用errors.As
.前导和尾随空格从 cookie 名称中删除,而不是被拒绝为无效。例如,“name =value”的 cookie 设置现在被接受为设置 cookie“name”。
-
net/netip
new
IPv6LinkLocalAllRouters
andIPv6Loopback
函数net/netip
等同于net.IPv6loopback
andnet.IPv6linklocalallrouters
。
-
pkg
在 Windows 上,该名称
NUL
不再被视为 和 中的Mkdir
特例Stat
。在 Windows 上,
File.Stat
当文件是目录时,现在使用文件句柄检索属性。以前它会使用传递给的路径Open
,如果文件已被移动或替换,则该路径可能不再是文件句柄所代表的文件。此更改修改Open
为没有访问权限的打开目录FILE_SHARE_DELETE
,这与常规文件的行为相匹配。在 Windows 上,
File.Seek
现在支持查找到目录的开头。
-
操作系统/执行
新
Cmd
字段Cancel
并WaitDelay
指定Cmd
当其关联Context
被取消或其进程退出时 I/O 管道仍由子进程保持打开状态时的行为。
-
路径/文件路径
新错误 立即但成功
SkipAll
终止。Walk
新
IsLocal
函数报告路径是否是目录的词法本地路径。例如,如果IsLocal(p)
istrue
,Open(p)
则将引用一个文件,该文件在词法上位于以当前目录为根的子树中。
-
反射 reflect
新的
Value.Comparable
andValue.Equal
方法可用于比较两个Value
s 是否相等。Comparable
报告Equal
给定Value
接收器的操作是否有效。新
Value.Grow
方法扩展了一个切片以保证其他n
元素的空间。新
Value.SetZero
方法将一个值设置为其类型的零值。Go 1.18 引入
Value.SetIterKey
和Value.SetIterValue
方法。这些是优化:v.SetIterKey(it)
意味着等同于v.Set(it.Key())
. 这些实现错误地忽略了对未优化表单中存在的未导出字段的使用检查。Go 1.20 更正了这些方法以包括未导出的字段检查。
-
正则表达式
Go 1.19.2 和 Go 1.18.7 包含对正则表达式解析器的安全修复,使其拒绝会消耗过多内存的非常大的表达式。因为 Go 补丁版本没有引入新的 API,所以
syntax.ErrInternalError
在这种情况下返回的解析器。Go 1.20 添加了一个更具体的错误,syntax.ErrLarge
解析器现在返回该错误。
-
运行时/cgo
Go 1.20 添加了新的
Incomplete
标记类型。cgo 生成的代码将用于cgo.Incomplete
标记不完整的 C 类型。
-
运行时/指标
Go 1.20 添加了新的支持指标,包括当前
GOMAXPROCS
设置 (/sched/gomaxprocs:threads
)、执行的 cgo 调用次数 (/cgo/go-to-c-calls:calls
)、互斥块总时间 (/sync/mutex/wait/total:seconds
) 以及垃圾收集中花费的各种时间度量。基于时间的直方图指标现在不太精确,但占用的内存少得多。
-
运行时间/pprof
互斥配置文件样本现在已预先缩放,解决了如果采样率在执行期间发生变化,旧的互斥配置文件样本将被错误缩放的问题。
在 Windows 上收集的配置文件现在包含内存映射信息,可修复与位置无关的二进制文件的符号化问题。
-
运行时/跟踪
垃圾收集器的后台清扫器现在产生的频率降低了,从而导致执行跟踪中的无关事件大大减少。
-
字符串
新的
CutPrefix
andCutSuffix
函数与 and 类似TrimPrefix
,TrimSuffix
但也报告字符串是否被修剪。
-
同步
新
Map
方法Swap
、CompareAndSwap
和CompareAndDelete
允许以原子方式更新现有映射条目。
-
系统调用
在 FreeBSD 上,FreeBSD 11 及更早版本所需的兼容性垫片已被删除。
在 Linux 上,
CLONE_*
定义了附加常量以用于该SysProcAttr.Cloneflags
字段。在 Linux 上,new
SysProcAttr.CgroupFD
和SysProcAttr.UseCgroupFD
字段提供了一种将子进程放入特定 cgroup 的方法。
-
测试
新方法
B.Elapsed
报告基准的当前经过时间,这可能有助于计算使用 报告的速率ReportMetric
。
-
时间
新的时间布局常量
DateTime
、DateOnly
和TimeOnly
为公共 Go 源代码调查中使用的三个最常见的布局字符串提供了名称。新
Time.Compare
方法比较两次。Parse
现在忽略其输入中的亚纳秒精度,而不是将这些数字报告为错误。该
Time.MarshalJSON
方法现在更加严格地遵守 RFC 3339。
-
统一码/utf16
新
AppendRune
函数将给定符文的 UTF-16 编码附加到 uint16 切片,类似于utf8.AppendRune
.`
相关文章:
Go最新版下载 Go1.20版新特性
Go官方正式发布了Go1.20稳定版 该版本依然保持 Go1 兼容性,可以升级到 Go1.20,而不需要做任何代码改动。 可以使用你任何喜欢的方式升级: 比如: go install golang.org/dl/go1.20latest 具体的可以参考官网教程: ht…...
Pywirt:一款基于Python的Windows安全应急响应工具
关于Pywirt Pywirt是一款基于Python开发的网络安全工具,该工具专门针对Windows操作系统设计,可以帮助广大研究人员使用winrm并通过在Windows操作系统上收集各种信息来加快安全事件应急响应的速度。 该工具已在Windows 10操作系统上进行过完整测试。 功…...
KDZD832 智能蓄电池活化仪
一、产品概述 KDZD832 智能蓄电池活化仪(2V-24V 一体机,适用于 2V、6V、12V/24V 蓄电池,以下简称活化仪),是专用于日常维护中对落后蓄电池处理的便携式产品,它具有四种独立的使用方式:电池放电…...
纯css实现loading加载中(多种展现形式)
前言 现如今网页越来越趋近于动画,相信大家平时浏览网页或多或少都能看到一些动画效果,今天我们来做一个有意思的动画效果,纯 css 实现 loading 加载中(多种展现形式),下面一起看看吧。 1. 常规 loading 实…...
【面试题】2023 vue高频面试知识点汇总
一、MVVM原理在Vue2官方文档中没有找到Vue是MVVM的直接证据,但文档有提到:虽然没有完全遵循MVVM模型,但是 Vue 的设计也受到了它的启发,因此在文档中经常会使用vm(ViewModel 的缩写) 这个变量名表示 Vue 实例。为了感受MVVM模型的…...
跨境电商选品重要吗?
选品很重要!跨境电子商务选择的核心要求:优质商品,价格优势,符合跨境销售特点,满足目标海外市场需求,突出自身特色竞争优势。跨境电商是如何选择产品的?这个问题也很流行,应该考虑以…...
SpringBoot
这里写目录标题1.入门程序1.1 spring-boot-starter-parent1.2 启动器1.3 EnableAutoConfiguration(重要)1.4 如何注册多个Controller?1.5 引导类2.完整的SpringBoot项目2.1 启动类2.1.1 创建一个启动类2.1.2 扩展: SpringBootConfiguration2.2 使用配置类定义组件2.3 SpringBo…...
python--turtle
前言 就随便练练,学习一下turtle库的使用 正文 1.语法学习 import turtle #导入库 turtle.showturtle() #画笔显示箭头 turtle.write("我是大帅逼") #写下字符串 turtle.forward(300) …...
NodeJS的后端Express项目部署到Ubuntu服务器,为前端提供API服务
之前参与的web3项目后端是用NodeJS开发的,因为可以共用NPM库,采用的Express框架,第一次弄,记录下大致的部署过程如下: 1、服务器上安装NodeJS sudo apt-get install nodejs 2、安装全局NPM工具,node_mod…...
作为研发如何使用Github Api?
文章目录使用步骤账号创建进行开发者相关设置API操作演示Github API好处推荐的Github API🌟个人主页: 个人主页 🚵♀️个人介绍:每天进步一点点,生活变得好一点点。 📌作为一位开发,不管是非工作的还是工作中的人士&…...
Java volatile学习
面试题: 1、请谈谈你对volatile的理解? volatile是Java虚拟机提供的轻量级的同步机制1.保证可见性2.不保证原子性3.禁止指令重排 2、JMM你谈谈?Java内存模型 3、你在哪些地方用到过volatile?单例模式CAS底层代码 目录 一、概述 1、可见性 2、原子性…...
用神经网络分类上和下
( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 做一个网络,输入为3个点,训练集A,B各有4张图片。让B的4张图片全是0.排列组合A,记录迭代次数平均值的变化。收敛误差为7e-4,每个网络收敛199次。 其中得到一组数据 差值结构 1-A-B 迭代次…...
VS Code 1.75 发布!
欢迎使用 2023 年 1 月版的 Visual Studio Code。希望您喜欢此版本中的许多更新,其中一些主要亮点包括:配置文件、VS Marketplace 签名、辅助功能改进、更轻松地调整多视图大小、树视图搜索历史、新的 Git 命令等等。让我们一起看看吧! 配置文…...
Vue2仿网易云风格音乐播放器(附源码)
Vue2仿网易云风格音乐播放器1、整体效果2、使用技术3、实现内容4、源码5、使用图片1、整体效果 2、使用技术 使用了HTML5 CSS3进行页面布局及美化使用Vue2进行数据渲染与页面交互使用Axios发送http请求获取数据 3、实现内容 实现了搜索歌曲功能,输入歌手或歌曲关…...
Spring相关面试题
文章目录请谈一下你对 spring 的理解?说一下 Spring 的核心是什么?请谈 一下你对 Spring IOC 和 和 AOP 的理解?请说一下 Spring 的 的 Bean 作用域?请谈一下Spring中bean对象的生命周期?Spring中的事务是如何实现的 &…...
操作符详解(上篇)
前言小伙伴们大家好,随着对c的不断学习今天我们将来学习操作符。在初始c语言中也介绍过操作符但也只是点到即可,今天我们将详细了解操作符。操作符分类:算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号…...
采样电路的3个组成部分
采样电路的使用实际上是电路的一个闭环控制过程,也可以理解为一个负反馈过程,采集的信号被传送到主控制芯片进行调整。今天就来为您介绍一下采样电路的三个组成部分分析!一起来看看吧! 这里的采样实际上分为电流采样、电压采样、…...
ffmpeg硬解码与软解码的压测对比
文章目录ffmpeg硬解码与软解码的压测一、基本知识二、压测实验1. 实验条件及工具说明2. 压测脚本3. 实验数据结果ffmpeg硬解码与软解码的压测 一、基本知识 本文基于intel集显进行压测 软解码:cpu对视频进行解码硬解码:显卡或者多媒体处理芯片对视频进…...
操作符——“C”
各位CSDN的uu们你们好呀,今天,总算是要到我们的操作符啦,在C语言中,操作符是一个极为复杂的东西,下面,就让我们进入操作符的世界吧 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符…...
YSP的UI界面设计
文章目录一、准备工作二、UI设计1.QPushButton:三、遇到的bug一、准备工作 1.MSVC和MinGW上编译的项目,不能用另一个编译器进行编译 2.若要使用MSVC编译器,需要下载对应版本的VS 见此篇:https://blog.csdn.net/Copperxcx/article…...
干货 | 什么是磁传感器?最常用的磁传感器类型及应用
1、什么是磁传感器?磁传感器通常是指将磁场的大小和变化转换成电信号。磁场,以地球磁场(地磁)或磁石为例的磁场是我们熟悉但不可见的现象。将不可见的磁场转化为电信号,以及转化为可见效应的磁传感器一直以来都是研究的主题。从几十年前使用电…...
操作符(运算符)详解
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 目录 🐰算数操作符: - * / % 🐰移位操作符&#x…...
【LeetCode每日一题】【2023/2/9】1797. 设计一个验证系统
文章目录1797. 设计一个验证系统方法1:哈希表代码总体1797. 设计一个验证系统 LeetCode: 1797. 设计一个验证系统 中等\color{#FFB800}{中等}中等 你需要设计一个包含验证码的验证系统。每一次验证中,用户会收到一个新的验证码,这个验证码在…...
计算机图形学:改进的中点BH算法
作者:非妃是公主 专栏:《计算机图形学》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、改进缘由二、…...
【SQL开发实战技巧】系列(六):从执行计划看NOT IN、NOT EXISTS 和 LEFT JOIN效率,记住内外关联条件不要乱放
系列文章目录 【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧…...
十分钟利用环信WebIM-vue3-Demo,打包上线一个即时通讯项目【含音视频通话】
这篇文章无废话,只教你如果接到即时通讯功能需求,十分钟利用环信WebIM-vue3-Demo,打包上线一个即时通讯项目【包含音视频通话功能】。 写这篇文章是因为,结合自身情况,以及所遇到的有同样情况的开发者在接到即时通讯&a…...
pandas——DataFrame基本操作(二)【建议收藏】
pandas——DataFrame基本操作(二) 文章目录pandas——DataFrame基本操作(二)一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.修改数据2.缺失值3.合并1.concat合并2.使用append方法合并3.使用merge进行合并4.使用…...
PostgreSQL查询引擎——General Expressions Grammar之restricted expression
General expressions语法规则定义在src/backend/parser/gram.y文件中,其是表达式语法的核心。有两种表达式类型:a_expr是不受限制的类型,b_expr是必须在某些地方使用的子集,以避免移位/减少冲突。例如,我们不能将BETWE…...
从某种程度上来看,产业互联网是一次对于互联网的弥补和修正
如果对当下我们正在经历的这样一个时代进行一次定义的话,我更加愿意将其划归到产业互联网的范畴里。可能有人会说,这与产业互联网并无联系,因为从本质上来看,当下我们所经历的这样一个时代,其实是与互联网并没有太多联…...
【C#Unity题】1.委托和事件在使用上的区别是什么?2.C#中 == 和 Equals 的区别是什么?
1.委托和事件在使用上的区别是什么? 委托和事件是C#中的重要概念,通俗来讲,委托是一个可以指向特定方法的指针,可以将委托分配给不同的脚本,使它们能够完成不同的任务。而事件则是一种使用委托实现的通知机制ÿ…...
兰州网站优化公司/网络营销环境分析
概述 Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的应用程序的完美解决方案。 Redis从它的许多竞争继承来的三个主要特点: Redis数据库完全在内存中,使用磁盘仅用于持久性。 相比许多键值数据存储&…...
培训加盟/seo网络推广机构
9月28日,在上海市经济和信息化委指导下,由上海市黄浦区科学技术委员会、上海市社会信用促进中心、中国人保金融服务有限公司和中国中小企业协会联合主办的“信用大数据创新应用大赛启动仪式”举行。上海市经济和信息化委员会副主任张英通过视频方式为本次…...
网站个人主页怎么做/百度seo培训要多少钱
第四章课后作业(6—27)6.试按下列要求分别编制程序段。(1)把标志寄存器中符号位SF置“1”。(2)寄存器AL中高、低四位互换。(3)由寄存器AX、BX组成一个32位带符号数(AX中存放高16位),试求这个数的负数。(4)现有三个字节存储单元A、B、C,在不使用ADD和ADC指…...
怎样自己做网站推广/seo技术分享
教育 -金融工程学-新-章节资料考试资料-宁波财经学院【】 1.1 随堂测试 1、【多选题】从交易层面来看,属于零和游戏的有: A、股票 B、期货 C、期权 D、互换 参考资料【 】 2、【判断题】远期合约出现的比期货合约早。 A、正确 B、错误 参考资料【 】 3、…...
做机械配件的网站/全网营销推广软件
上下文切换(Context Switch),也称为PCB,性质为环境切换。上下文切换,有时也称做进程切换或任务切换,是指CPU 从一个进程或线程切换到另一个进程或线程。中文名上下文切换外文名Context Switch性质切换进程控…...
做网站企业经营范围/百度最新秒收录方法2023
由于 linux 是 64位, jdk 是32 位,导致不能执行 。转载于:https://www.cnblogs.com/sherryxl/p/9201126.html...