Go 1.20要来了,看看都有哪些变动-第4篇
前言
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 mainimport ( "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, err1err2err is err1err is err2*fmt.wrapError, err1err2err3 is err1err3 is err2
详情能够参考:https://pkg.go.dev/errors@mas...
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.
详情能够参考:https://pkg.go.dev/net/http@m...。
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") },}
详情能够参考:https://pkg.go.dev/net/http/h...。
规范库的批改
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。
知乎:无忌。
福利
我为大家整顿了一份后端开发学习材料礼包,蕴含编程语言入门到进阶常识(Go、C++、Python)、后端开发技术栈、面试题等。
关注公众号「coding进阶」,发送音讯 backend 支付材料礼包,这份材料会不定期更新,退出我感觉有价值的材料。还能够发送音讯「进群」,和同行一起交流学习,答疑解惑。
References
- https://tip.golang.org/doc/go...