在 go 中,可通过切片语法 `arr[:]` 将固定长度数组(如 `[32]byte`)安全、零拷贝地转换为对应类型的切片(如 `[]byte`),无需内存复制,直接复用底层数组。
Go 的数组和切片虽密切相关,但类型系统严格区分:[32]byte 是值类型,而 []byte 是引用类型(包含指针、长度、容量三元组)。二者不能隐式转换,也不能通过类型断言(如 []byte(x))直接转换——这会触发编译错误。
正确且高效的方式是使用切片操作符 [:]:
x := Foo() // x 是 [32]byte 类型 Bar(x[:]) // x[:] 生成指向 x 底层数组的 []byte 切片,长度=32,容量=32
该操作不分配新内存,不复制元素,仅构造一个新的切片头(slice header),其 Data 字段指向原数组首地址。这是 Go 官方推荐的标准做法,完全安全且零开销。
⚠️ 注意事项:

✅ 总结:对 [N]T 到 []T 的转换,始终优先使用 arr[:]。它简洁、安全、高效,是 Go 类型系统设计的自然体现,也是标准库和主流项目中的通用实践。