2022 年 4 月的感兴趣的提交记录

以下是我对 golang/go 主分支上的提交进行了个人关注并列出的列表。

这是上次制作的清单。

 

尽管我在简单解释中添加了一些内容,但可能存在误解或错误。

主题

请提交

2022年4月1日

 

楕円曲線暗号で使用するP-256の処理において、パニックを引き起こす問題が修正されました。この修正はバックポートされ、Go 1.17.9およびGo 1.18.1が既にリリースされています。

 

一般而言,如果在 Go 中存在特定于操作系统或体系结构的处理,则通常使用文件名指定 GOOS 和 GOARCH。
可以使用代码目录中的标签通过 build.Package 的 AllTags 查找,但修复了仅在指定了 GOOS 和 GOARCH,并且运行环境与 GOARCH 匹配的情况下,不包含 GOOS 的问题。

 

如果有可用的AVX2(当GOAMD64大于3时),将优化用于清零连续内存的运行时函数memclrNoHeapPointers()。

 

由于 Go 1.18 引入了新的 GC Pacer,因此删除了旧代码。

 

修复了将Unicode U+007F作为参数传递给strconv.Quote()函数时,控制字符(DELETE)没有被转义的问题。4

 

Go 1.18修复了当使用go work use时,如果传递的不是一个目录而是一个文件名,将会发生panic的问题。

 

当HTTP响应状态为301且没有Location标头时,现已解决无法获取响应内容的问题。原本通常情况下,状态301应该与Location标头一起使用(根据RFC 7231中的规定),但由于存在不设置Location标头的服务器(如Amazon S3),因此已做了相应的处理。

 

已为 arm64 添加了指令支持,似乎是因为 gVisor 需要它。

2022年4月2日

 

这是针对Go文档格式更改的一部分工作。在Go 1.19中,gofmt将支持文档注释,并添加了用于解析语法的包。

 

在Go 1.18中修复了一个错误,该错误会在使用Go 1.13之前的环境中遇到未指定类型的移位操作时发出警告。这是在使用使用Go 1.18构建的gopls对Go 1.11代码进行修正时遇到的问题。

2022年4月4日

 

在网络中,当取消或超时发生时,可以使用 errors.Is(err,context.Canceled) 或 errors.Is(err,context.DeadlineExceeded) 来判断错误。这与之前已经存在的 net.Error 是兼容的,并且没有任何问题。9

 

Windows平台上也进行了修复以处理os.Interrupt。遗憾的是,这个修复在后来被撤销了。10

 

在 Go 1.18 中,修复了传递给 go work use -r 的不存在的目录名会导致恐慌的问题。

 

当嵌套正则表达式超过深度限制(1000)时,新增了一个名为ErrInvalidDepth的错误定义。在Go 1.18发布之前,深度限制检查已在Go 1.16和Go 1.17进行了回溯移植。然而,在这个时候还是使用现有的错误形式。

顺便提一下,ErrInvalidDepth 已经被另一个提交重命名为ErrNestingDepth了。在原始提案中,ErrNestingDepth 应该是被错误地表示为 ErrInvalidDepth。

2022年4月5日

 

从Go 1.18开始,对于以SHA-1格式签名的证书的验证已被禁用。然而,由于OCSP响应或CRL也被禁用,导致与WebPKI的兼容性问题,因此修复仅限于证书。此修复还被移植到了Go 1.18.1版本中。

 

reflect.Type.NumMethod()和reflect.Value.NumMethod()的注释已经被修改。
在使用它们与接口一起时,存在文档与实际行为不一致的问题,但已经采取了修正文档的措施。
原本计划在Go 1.16中修复此问题作为缺陷,但由于兼容性问题而被取消。

 

新版本中可以比较不可比较的值(如映射或切片)和nil。

 

在比较相同大小的数组(不是切片)时,使用展开进行优化的代码生成被执行。

2022年04月06日

 

证书的验证过程已经被修正。19 20

 

由于哈希/映射哈希的开销很大,因此已经添加了直接从字符串或字节序列中获取哈希值的函数。二十一

2022年4月7日。

 

在NetBSD环境中进行的测试修复了特定的错误。 这是Go的核心测试,对实现没有任何影响。

 

在 riscv64 架构上启用了基于寄存器的函数调用约定。
它是继 amd64、arm64 和 ppc64 之后的下一代架构。
(默认启用并非由此提交,而是在另一个提交中进行的)

 

在sort包中添加了一个名为Find()的函数,用于进行二分查找。虽然已经存在sort.Search()函数,但是这次添加的函数还改变了比较函数的类型,并且还会返回是否存在匹配的项。

2022年4月12日

 

这里增加了一个doc/comment包。尽管没有详细说明,但进行了许多更改。

 

对于已关闭的通道,接收处理的性能得到了改善。 25

2022年4月13日

 

修复了在给定包含错误的大型PEM文件时可能导致堆栈溢出的问题。这个修复已经进行了回退,Go 1.17.9和Go 1.18.1已经发布。

 

修复了在 Go 1.16 中添加的 embed 功能中,当尝试嵌入位于根目录的目录时无法正常工作的问题。这个问题在使用 Dockerfile 进行构建时容易遇到。

 

Go 1.18添加了buildvcs选项,默认值也从手动更改为自动。
之前的默认值为true,但当VCS目录存在时却无法使用工具,导致构建失败的问题似乎出现了。29

2022年4月14日

 

パッケージのソート処理は、quicksortからpdqsort(Pattern-defeating quicksort)ベースの実装に変更されました。多くのケース(特にソート済みスライス)では、従来よりも高速になるようです。

2022年4月15日

 

这个修改是为了用跳转表而不是二分搜索来实现开关。并不总是使用跳转表,似乎也存在对可用架构的限制。

 

在编译时确定的switch case处理已经改进了,像runtime.GOOS这样的操作很常见。

 

在字节切片中添加了一个追加编码为Varint的值的函数。Varint编码是在protobuf中使用的格式,似乎在protobuf中也实现了类似的(但稍微优化了一些)函数。

2022年4月16日

 

http.Request.WithContext() 函数已经删除了不必要的数据复制。34

 

据说,http.StatusText() 的实现已经从映射变为switch case。这将有望实现编译时优化。

 

这个问题在 macOS 环境中的死锁情况已经修复。似乎在 goroutine 的抢占和信号处理的组合中存在问题,已在 Go 1.17 和 Go 1.18 中进行了补丁。

2022年4月17日

 

reflect.Value.Type() 现在可以进行内联处理了。
虽然并不总是能够始终享受内联处理的好处,但似乎有一些微不足道的效果。

2022年4月20日

 

根据平台统一了从crypto/rand生成器中读取随机数的处理方式,并修复了不进行缓冲的问题。以前是通过bufio缓冲4096字节,现在改为每次获取,这样可以获得更新鲜的值,并且预计在多核心上获取随机数时可以提高性能。

2022年4月21日

 

新增了一个函数fastrand64(),可以在运行时获取随机的uint64值。虽然无法在常规程序中使用,但似乎可以从标准库的某些部分中使用。 36 37 38

2022年4月22日

 

在POSIX平台上,如果在exec.Cmd中,Dir不为空但Env为空,子进程将会把Dir作为环境变量PWD传递过去。39
此外,还新增了exec.Cmd.Environ()函数,可以获取传递给命令的环境变量。

 

当使用bufio.Writer.WriteString()写入超过缓冲区大小的字符串时,如果writer支持WriteString(),则会直接写入而不经过缓冲区,从而减少不必要的复制。
而写入[]byte的Write()似乎自以前就是这样。

 

正在对生成结构体和数组比较代码的处理进行重构。40

 

一些方法现已能够在 reflect.Value 中进行内联化处理。在获取 map 或数组长度时有轻微的性能下降,但除此之外的情况下都有加速,并对 encoding/json 产生影响。

2022年4月26日

 

http.MaxBytesReader定义了http.MaxBytesError作为其返回的错误。这样可以检查错误的原因。

2022年4月27日

 

GC现在变为每两分钟启动一次,使用的空闲标记工作线程数量最多为1个(如果已经存在GC工作线程,则为0个)。这样一来,可以避免Go程序中几乎没有GC启动时CPU利用率急剧上升的问题。

 

GC的goroutine在哪个线程上运行的判断处理(调度)已经改进了。以前会出现将已停止的线程分配给它的问题。

2022年4月29日

 

似乎将Go运行时产生的异常分为用户代码原因和其他原因。这样可以更容易地进行问题排查,希望能够达到这个目的。

2022年4月30日

 

如果在Go 1.18中使用基于string的定义类型作为map的key,reflect.Value.SetMapIndex()和reflect.Value.MapIndex()将修复一个正常的string也可以成功的问题。这个问题在Go 1.18中引入并进行了回溯修复。

杂感

由于Go 1.18发布的延迟,4月份的提交较多。
尽管在4月份时尚未完成,但Go 1.19可能会包含以下变更。

    • 新しいアーキテクチャ linux/loong64 が利用可能になりそうです。 48

BoringCrypto を使うための dev.boringcrypto ブランチを master にマージしようとしているようです。 49

另外,Go开发者分享了关于Go 1.19的新功能的推文,我将为大家介绍。
虽然我一直在跟踪提交记录,但还是漏掉了很多东西。

 

以下是对应的中文翻译:1. https://github.com/golang/go/issues/52075
2. https://github.com/advisories/GHSA-v5qw-m6mv-3q79
3. https://github.com/golang/go/issues/52053
4. https://github.com/golang/go/issues/52062
5. https://github.com/golang/go/issues/51749
6. https://github.com/golang/go/issues/49281
7. https://github.com/golang/go/issues/51082
8. https://github.com/golang/go/issues/52031
9. https://github.com/golang/go/issues/51428
10. https://github.com/golang/go/commit/f86f9a3038eb6db513a0ea36bc2af7a13b005e99
11. https://github.com/golang/go/issues/51841
12. https://github.com/golang/go/issues/51684
13. https://github.com/golang/go/issues/51112
14. https://github.com/golang/go/commit/575fd8817ae9817303a69065def80c574718169e
15. https://github.com/golang/go/commit/0bf545e51f5303ddedb0ea60f02ff221ac088fc7
16. https://tip.golang.org/doc/go1.18#sha1
17. https://github.com/golang/go/issues/41682#issuecomment-1072695832
18. https://github.com/golang/go/issues/51642
19. https://github.com/golang/go/issues/48869
20. https://github.com/golang/go/issues/45856
21. https://github.com/golang/go/issues/42710
22. https://github.com/golang/go/issues/52168
23. https://github.com/golang/go/issues/50340
24. https://github.com/golang/go/issues/51082
25. https://github.com/golang/go/issues/52067
26. https://github.com/golang/go/issues/51853
27. https://github.com/advisories/GHSA-q42m-q8hq-53rj
28. https://github.com/golang/go/issues/49570
29. https://github.com/golang/go/issues/51748
30. https://github.com/golang/go/issues/50154
31. https://github.com/golang/go/issues/50253
32. https://github.com/golang/go/issues/51644
33. https://pkg.go.dev/google.golang.org/protobuf/encoding/protowire
34. https://github.com/golang/go/issues/52239
35. https://github.com/golang/go/issues/52226
36. https://github.com/golang/go/commit/c2d436dcfad64d5cc301cf05d446f7a93c19133e
37. https://github.com/golang/go/commit/01b8f5e8821eac0e3456d6200b351629fd3752f4
38. https://github.com/golang/go/commit/a4bbcd4b1fc9dd40e0f86416d37bdd9e6d430f3f
39. https://github.com/golang/go/issues/50599
40. https://github.com/golang/go/issues/38674
41. https://github.com/golang/go/issues/30715
42. https://github.com/golang/go/issues/44163
43. https://github.com/golang/go/issues/37116
44. https://github.com/golang/go/issues/39004
45. https://github.com/golang/go/issues/44313
46. https://github.com/golang/go/issues/51485
47. https://github.com/golang/go/issues/52379
48. https://github.com/golang/go/issues/46229
49. https://github.com/golang/go/issues/51940

bannerAds