Go语言中[][]byte与自定义[]Bytes类型的互转方法咨询
问题说明
你定义的Bytes是[]byte的类型别名,但[][]byte与[]Bytes属于不同的切片类型(前者元素是原生[]byte,后者元素是自定义的Bytes),Go不允许直接强制转换,以下是两种可行的转换方案:
转换方案
1. 安全循环转换(推荐)
利用单个[]byte和Bytes可直接转换的特性,通过循环逐个处理切片元素,完全符合Go的类型安全规则,无任何风险:
package main type Bytes []byte func main() { // [][]byte 转 []Bytes src1 := make([][]byte, 3) dst1 := make([]Bytes, len(src1)) for i := range src1 { dst1[i] = Bytes(src1[i]) } // []Bytes 转 [][]byte src2 := make([]Bytes, 3) dst2 := make([][]byte, len(src2)) for i := range src2 { dst2[i] = []byte(src2[i]) } }
2. unsafe包快速转换(仅性能敏感场景使用)
由于[][]byte和[]Bytes的内存布局完全一致,可通过unsafe包直接转换底层数组类型,速度极快,但会跳过Go的类型检查,操作不当易引发panic或内存问题,仅适合完全可控的性能敏感场景:
package main import "unsafe" type Bytes []byte func main() { src := make([][]byte, 3) // [][]byte 转 []Bytes dst1 := *(*[]Bytes)(unsafe.Pointer(&src)) // []Bytes 转 [][]byte dst2 := *(*[][]byte)(unsafe.Pointer(&dst1)) }
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

