前语
Go官方团队在2022.12.08发布了Go 1.20 rc1(release candidate)版别,Go 1.20的正式release版别估计会在2023年2月份发布。
让咱们先睹为快,看看Go 1.20给咱们带来了哪些改变。
安装办法:
$ go install golang.org/dl/go1.20rc1@latest
$ go1.20rc1 download
这是Go 1.20版别更新内容详解的第4篇,欢迎大家关注大众号,及时获取本系列最新更新。
Go 1.20发布清单
和Go 1.19比较,改动内容适中,首要涉及言语(Language)、可移植性(Ports)、东西链(Go Tools)、运行时(Runtime)、编译器(Compiler)、汇编器(Assembler)、链接器(Linker)和中心库(Core library)等方面的优化。
第1篇首要涉及Go 1.20在言语、可移植性方面的优化,原文链接:Go 1.20版别晋级内容第1篇。
第2篇首要涉及Go命令和东西链方面的优化,原文链接:Go 1.20版别晋级内容第2篇。
第3篇首要涉及Go在运行时、编译器、汇编器、链接器等方面的优化,原文链接:Go 1.20版别晋级内容第3篇。
本文重点介绍Go 1.20在中心库方面的优化。
crypto/ecdh
Go 1.20新增了 crypto/ecdh
这个package,ecdh
完成了Elliptic Curve Diffie-Hellman这个新的加密算法。
封装多个error
Go 1.20答应一个error变量里封装多个error。
package main
import (
"errors"
"fmt"
)
func main() {
err1 := errors.New("err1")
err2 := errors.New("err2")
err := errors.Join(err1, err2)
fmt.Printf("%T, %v\n", err, err)
if errors.Is(err, err1) {
fmt.Println("err is err1")
}
if errors.Is(err, err2) {
fmt.Println("err is err2")
}
err3 := fmt.Errorf("error3: %w", err)
fmt.Printf("%T, %v\n", err3, errors.Unwrap(err3))
if errors.Is(err3, err1) {
fmt.Println("err3 is err1")
}
if errors.Is(err3, err2) {
fmt.Println("err3 is err2")
}
}
这段程序的输出结果为:
*errors.joinError, err1
err2
err is err1
err is err2
*fmt.wrapError, err1
err2
err3 is err1
err3 is err2
概况能够参阅:pkg.go.dev/errors@mast…
fmt.Errorf
里带有%w
参数,就会回来一个完成了Unwrap办法的error类型的变量。
HTTP ResponseController
net/http
这个package新增了名为ResponseController
的新类型。
func RequestHandler(w ResponseWriter, r *Request) {
rc := http.NewResponseController(w)
rc.SetWriteDeadline(0) // disable Server.WriteTimeout when sending a large response
io.Copy(w, bigData)
}
A ResponseController is used by an HTTP handler to control the response.
A ResponseController may not be used after the Handler.ServeHTTP method has returned.
概况能够参阅:pkg.go.dev/net/http@ma…
Rewrite钩子函数
httputil.ReverseProxy
类型新增了一个 Rewrite
办法,这是一个钩子函数,用来取代之前的Director
钩子函数。
proxyHandler := &httputil.ReverseProxy{
Rewrite: func(r *httputil.ProxyRequest) {
r.SetURL(outboundURL) // Forward request to outboundURL.
r.SetXForwarded() // Set X-Forwarded-* headers.
r.Out.Header.Set("X-Additional-Header", "header set by the proxy")
},
}
概况能够参阅:pkg.go.dev/net/http/ht…
标准库的修改
-
bytes
新增了
CutPrefix
和CutSuffix
函数,这2个函数功能上相似TrimPrefix
和TrimSuffix
,可是还会回来一个bool类型的变量,表明这个string是否被修改了。新增了
Clone
函数,会创立一个byte slice的复制。 -
encoding/binary
ReadVarint
和ReadUvarint
函数如果读的数据的值被损坏,比方只写了一部分内容,会回来io.ErrUnexpectedEOF
,而不是像之前回来io.EOF
。 -
errors
新的
Join
函数能够把多个error变量的值组合在一起,封装为一个新的error变量。 -
fmt
Errorf
支撑%w
格式化字符串,能够回来一个完成了Unwrap办法的error类型变量。 -
strings
新增了
CutPrefix
和CutSuffix
函数,这2个函数功能上相似TrimPrefix
和TrimSuffix
,可是还会回来一个bool类型的变量,表明这个string是否被修改了。新增了
Clone
函数,会创立一个string的复制。 -
sync
Map
类型新增了3个新办法:Swap
,CompareAndSwap
和CompareAndDelete
,答应对已有的map做原子更新。 -
testing
新增了
B.Elapsed
办法,能够回来当前的benchmark功能测试耗时了多久。 -
time
新增了3个常量
DateTime
,DateOnly
和TimeOnly
,便利开发者做格式转换,不用在代码里写死”2006-01-02 15:04:05″。
总结
Go 1.20版别即将在2023年2月份发布。
总体而言,Go 1.20版别没有大的修改,首要在细节方面做了各种优化。
推荐阅读
-
Go 1.20要来了,看看都有哪些改变-第1篇
-
Go 1.20要来了,看看都有哪些改变-第2篇
-
Go 1.20要来了,看看都有哪些改变-第3篇
-
Go面试题系列,看看你会几题
-
Go常见过错和最佳实践系列
开源地址
文章和示例代码开源在GitHub: Go言语初级、中级和高级教程。
大众号:coding进阶。关注大众号能够获取最新Go面试题和技能栈。
个人网站:Jincheng’s Blog。
知乎:无忌。
References
- tip.golang.org/doc/go1.20