共计 3132 个字符,预计需要花费 8 分钟才能阅读完成。
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 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@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…