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

    新增了 CutPrefixCutSuffix 函数,这2个函数性能上相似 TrimPrefixTrimSuffix ,然而还会返回一个bool类型的变量,示意这个string是否被批改了。

    新增了 Clone 函数,会创立一个byte slice的拷贝。

  • encoding/binary

    ReadVarintReadUvarint函数如果读的数据的值被损坏,比方只写了一部分内容,会返回 io.ErrUnexpectedEOF,而不是像之前返回io.EOF

  • errors

    新的 Join函数能够把多个error变量的值组合在一起,封装为一个新的error变量。

  • fmt

    Errorf反对%w格式化字符串,能够返回一个实现了Unwrap办法的error类型变量。

  • strings

    新增了CutPrefixCutSuffix函数,这2个函数性能上相似 TrimPrefixTrimSuffix ,然而还会返回一个bool类型的变量,示意这个string是否被批改了。

    新增了 Clone函数,会创立一个string的拷贝。

  • sync

    Map 类型新增了3个新办法: SwapCompareAndSwapCompareAndDelete ,容许对已有的map做原子更新。

  • testing

    新增了B.Elapsed 办法,能够返回以后的benchmark性能测试耗时了多久。

  • time

    新增了3个常量DateTimeDateOnlyTimeOnly,不便开发者做格局转换,不必在代码里写死"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...