go - 将类型 T 的 slice 转换为 Go 中的字节 slice 的快速方法

标签 go tcp unsafe-pointers

我有不同类型的 slice ,我需要用 TCP 发送它们。我的 slice 长度很大,而且不是一个常数值。有什么方法可以将 slice 转换为 []byte 而无需循环各个元素?例如,我想要这样的东西(假设这里的 mySlice 元素是 4 字节):

byteSlice := (*[4 * len(mySlice)]byte)(unsafe.Pointer(&mySlice[0]))

但它不会工作,因为 4 * len(mySlice) 不是常量。

谢谢。

最佳答案

这就是我最终所做的(将其发布为我的问题的答案):

import "unsafe"
import "reflect"   

mySliceR := *(*reflect.SliceHeader)(unsafe.Pointer(&mySlice))
mySliceR.Len *= mySliceElemSize
mySliceR.Cap *= mySliceElemSize

byteSlice := *(*[]byte)(unsafe.Pointer(&mySliceR))

我针对不同的数组大小对其进行了测试,它比仅在数组足够大时循环遍历单个元素(仅使用 unsafe.Pointer)要好。

关于go - 将类型 T 的 slice 转换为 Go 中的字节 slice 的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45596789/

相关文章:

xml - Golang XML 处理

TCP 拥塞窗口大小

go - 定时器在 Golang 中是如何工作的

go - 如何发送中断信号

go - 使用 redigomock 测试事务(MULTI)命令

tcp - 大容量TCP Client的设计

c - 使用 RAW 套接字发送 SYN 后未收到 SYN/ACK

Swift 在范围内改变数据

swift - 不安全可变指针<UInt8> : What's the risk?

swift - 为什么 Swift "Managed.fromOpaque.takeUnretainedValue()"保留值?