Go 1.23 新特性之slices 和 sync核心库

slices 库的新增特性

Repeat 函数

slices 库新增了一个 Repeat 函数,该函数返回一个新切片,该切片是将原始切片重复指定次数后的结果。

函数签名:

Repeat[S ~[]E, E any](x S, count int) S
  • S 是切片类型,即 ~[]E,表示任意元素类型 E 组成的切片。
  • E 是切片中的元素类型,any 表示可以是任何类型。
  • x S 是传入的原始切片,类型为 S
  • count int 是指定重复的次数,即原始切片 x 将会被重复 count 次。
  • 返回值类型 S 是新的切片,包含了原始切片重复后的结果。

代码示例:

package main

import (
    "fmt"
    "slices"
)

func main() {
    s := []string{"go1.23", "新特性"}
    repeat := slices.Repeat(s, 2)
    fmt.Println(repeat)
}

程序运行结果:

[go1.23 新特性 go1.23 新特性]

需要注意的是,当指定的参数 count 为负数或新切片长度 len(x) * count 溢出时,将会发生 panic

sync 库的新增特性

Map.Clear 方法

Go 1.23 版本的 sync 库中,新增了 Map.Clear 方法。这个方法用于删除所有元素,使 Map 变为空。

代码示例:

package main

import (
    "fmt"
    "sync"
)

func main() {
    mp := &sync.Map{}
    mp.Store("name", "小王")
    mp.Store("age", 18)
    fmt.Println(mp.Load("name"))
    fmt.Println(mp.Load("age"))
    mp.Clear()
    fmt.Println(mp.Load("name"))
    fmt.Println(mp.Load("age"))
}

程序运行结果:

小王 true
18 true
<nil> false
<nil> false

实际上,Clear 方法内部也是通过调用 clear 函数来清空 sync.Map 结构体中维护的底层 map 对象。

panic 改进

Go 1.23 版本中,程序发生 panic 后打印的回溯信息里,错误信息的第二行以及后续行将会缩进一个制表符,以便能够明确区分这些行与第一个 goroutine 的堆栈跟踪。

示例代码:

package main

func main() {
    panic("go1.23\n新\n特\n性")
}

Go 1.23 版本中的运行结果:

panic: go1.23
    新
    特
    性
goroutine 1 [running]:
main.main()
    /go/main.go:4 +0x25

os 库的新增特性

CopyFS 函数

os 库新增了一个 CopyFS 函数,用于将 fsys.FS 安全地复制到本地文件系统。

函数签名:

func CopyFS(dir string, fsys fs.FS) error
  • dir 是目标目录的路径。如果这个目录不存在,CopyFS 会自动创建它。
  • fsys 是要复制的文件系统,为 fs.FS 接口的一个实例。

代码示例:

package main

import (
    "os"
)

func main() {
    fs := os.DirFS("/Users/chenmingyong/workspace/temp")
    err := os.CopyFS("/Users/chenmingyong/workspace/temp2", fs)
    if err != nil {
        panic(err)
    }
}

需要注意的是 CopyFS 不会覆盖目标目录中已有的文件。如果 fsys 中的某个文件在目标目录中已经存在,函数会返回一个错误。

path/filepath 库的新增特性

Localize 函数

path/filepath 库新增了一个 Localize 函数,该函数主要用于将以斜杠 / 分隔的路径转换为操作系统特定的路径格式。

代码示例:转 Windows 路径

package main

import (
    "fmt"
    "path/filepath"
)

func main() {
    unixPath := "chenmingyong/file.txt" // Unix 风格的路径
    localizedPath, err := filepath.Localize(unixPath)
    if err != nil {
        panic(err)
    }
    fmt.Printf("本地化后的路径: %s\n", localizedPath)
    illegalPath := "C:\\Users\\chenmingyong\\Desktop\\file.txt" // 非法路径
    _, err = filepath.Localize(illegalPath)
    if err != nil {
        fmt.Printf("错误信息: %s\n", err)
    }
}

程序运行结果:

本地化后的路径: go\file.txt
错误信息: invalid path

Localize 函数内部会通过 io/fs.ValidPath 来校验路径的合法性,路径中不能包含任何无效字符或格式,否则会返回 error

小结

本文主要介绍了 Go 1.23 版本中 slicessync 等核心库的新增特性及其用法。整体而言,这些改进和新增功能大大提升了开发者在使用 Go 语言进行开发时的体验和效率。

打 赏