Go 1.21新功能快速指南

Go 1.21 将于 2023 年 8 月发布。该版本主要关注映射maps、切片slices和通道channels的辅助函数。

让我们看看 Go 1.21 新增了什么:

Min, Max, 和Clear函数
Go 为切片slices、映射maps和通道channels添加了一些默认函数。您可以如规范所示使用这些函数。

var x, y int
m := min(x)                 // m == x
m := min(x, y)              
// m is the smaller of x and y
m := max(x, y, 10)          
// m 是 x 和 y 的较大值,但至少是 10
c := max(1, 2.0, 10)        
// c == 10.0 (浮点类型)
f := max(0, float32(x))    
//  f 的类型是 float32
var s []string
_ = min(s...)              
//  // 无效:不允许使用它作为slice参数
t := max(
"", "foo", "bar")  // t == "foo" (string kind)

标准日志包
Go 1.21 提供了结构化日志(slog)。您可以包含一条消息、设置日志严重性并添加键值对。此版本还包括用于测试目的的slogtest包。

logger := slog.New(slog.NewJSONHandler(os.Stdout, nil )) 
logger.Info( "hello" , "count" , 3 )

Map
借助泛型函数的强大功能,Go 1.21 提供了几个非常有用的新函数。

func  Clone (m M) M
 func  Copy (dst M1, src M2) 
func  DeleteFunc (m M, del func (K, V)  bool )
 func  Equal (m1 M1, m2 M2)  bool 
func  EqualFunc (m1 M1, m2 M2, eq func (V1, V2)  bool ) bool


切片函数
与Map函数一样,我们可以在切片上使用排序、包含、比较、反向、二分查找和索引函数。您可以在此页面上找到完整的功能列表。以下是函数的一些示例用法及其结果(作为注释)。

 names := []string{"Vera", "Bob", "Alice"}
 slices.IsSorted(names)
// false
 slices.Sort(names)
// [Alice Bob Vera]
 slices.Compare(names, []string{
"Alice", "Bob", "Vera"}) // 0 
 slices.BinarySearch(names,
"Bob") // 1 true
 slices.Reverse(names)
// [Vera Bob Alice]
 slices.Insert(names, 1,
"Bob") // [Vera Bob Bob Alice]
 slices.Compact(names)
// [Vera Bob Alice]

比较和减函数
cmp 包中定义的有序类型比较函数。它适用于 int(8,64)、uint(8,64,ptr)、float(32,64) 和字符串。

func Compare(x, y T) int
func Less(x, y T) bool

配置文件引导优化 (PGO)
该功能在 Go 1.20 中引入,并在 Go 1.21 中成为默认功能。通过此功能,Go 启用了AutoFDO功能。根据应用程序行为,它可提供 2-7% 的性能提升。您可以查看功能页面以了解实施细节。