今天是周末的,虽然只有一天。给大家分享一个 Go1.17 的小快讯。一天增长一个吸鱼小技巧!

在 Go 语言中,一个切片(slice)包含了对其支持数组的引用,无论这个数组是作为一个独立的变量存在于某个地方,还是仅仅是一个为支持分片而分配的匿名数组。

其切片基本结构都如下:

// runtime/slice.go
type slice struct {
    array unsafe.Pointer // 指向底层数组的指针
    len   int // 长度 
    cap   int // 容量
}

目前切片这种支持数组的方式可能会导致切片出现有趣的内存泄漏或对你的切片产生令人惊讶的变化。

另外很重要的一点,在 Go 1.16 及以前,不存在将从切片类型转换为数组类型的安全方法,比较无奈。

我们只能通过调用标准库 reflect 或 unsafe,通过编写不安全的代码来做到这一点:

(*[10]byte)(unsafe.Pointer(&b[0]))

显然这是不优雅的,官方自己都不

有没有发现Go 1.17将允许切片转换为数组指针啦?