前语

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

    新增了 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。

知乎:无忌。

References

  • tip.golang.org/doc/go1.20