关于go:Go-120要来了看看都有哪些变化第4篇

1次阅读

共计 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

    新增了 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…
正文完
 0