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.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在核心库方面的优化。
Go 1.20新增了 crypto/ecdh
这个package,ecdh
实现了Elliptic Curve Diffie-Hellman这个新的加密算法。
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
详情可以参考:https://pkg.go.dev/errors@master#pkg-overview
fmt.Errorf
里带有%w
参数,就会返回一个实现了Unwrap方法的error类型的变量。
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@master#ResponseController。
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/httputil@master#ReverseProxy.Rewrite。
-
新增了
CutPrefix
和CutSuffix
函数,这2个函数功能上类似TrimPrefix
和TrimSuffix
,但是还会返回一个bool类型的变量,表示这个string是否被修改了。新增了
Clone
函数,会创建一个byte slice的拷贝。 -
ReadVarint
和ReadUvarint
函数如果读的数据的值被损坏,比如只写了一部分内容,会返回io.ErrUnexpectedEOF
,而不是像之前返回io.EOF
。 -
新的
Join
函数可以把多个error变量的值组合在一起,封装为一个新的error变量。 -
Errorf
支持%w
格式化字符串,可以返回一个实现了Unwrap方法的error类型变量。 -
新增了
CutPrefix
和CutSuffix
函数,这2个函数功能上类似TrimPrefix
和TrimSuffix
,但是还会返回一个bool类型的变量,表示这个string是否被修改了。新增了
Clone
函数,会创建一个string的拷贝。 -
Map
类型新增了3个新方法:Swap
,CompareAndSwap
和CompareAndDelete
,允许对已有的map做原子更新。 -
新增了
B.Elapsed
方法,可以返回当前的benchmark性能测试耗时了多久。 -
新增了3个常量
DateTime
,DateOnly
和TimeOnly
,方便开发者做格式转换,不用在代码里写死"2006-01-02 15:04:05"。
Go 1.20版本即将在2023年2月份发布。
总体而言,Go 1.20版本没有大的修改,主要在细节方面做了各种优化。
文章和示例代码开源在GitHub: Go语言初级、中级和高级教程。
公众号:coding进阶。关注公众号可以获取最新Go面试题和技术栈。
个人网站:Jincheng's Blog。
知乎:无忌。
我为大家整理了一份后端开发学习资料礼包,包含编程语言入门到进阶知识(Go、C++、Python)、后端开发技术栈、面试题等。
关注公众号「coding进阶」,发送消息 backend 领取资料礼包,这份资料会不定期更新,加入我觉得有价值的资料。还可以发送消息「进群」,和同行一起交流学习,答疑解惑。