我设法在Go中使用以下功能。但是我想优化/概括代码,这样这个函数会返回一个指向我传递给函数的任何值的第一个字节的指针。目前它只适用于[] uint32,但我想用它来获取起始内存地址作为许多其他类型的*字节(即byte [],int [],string等)。
是否有更通用的方法来实现这一点而不是捕获我需要作为案例陈述处理的每一种类型?
Go Playground Link以获取以下代码:https://play.golang.org/p/KtNTbERQGa
package main
import (
"fmt"
"reflect"
"unsafe"
)
func ToBytePointer(data interface{}) *byte {
fmt.Println("Received type is", reflect.TypeOf(data))
switch data.(type) {
case []uint32:
typedData := data.([]uint32)
return (*byte)(unsafe.Pointer(&typedData[0]))
default:
return nil
}
}
func main() {
var data = []uint32{1, 2, 3}
var dataBytePointer = (*byte)(unsafe.Pointer(&data[0]))
fmt.Println(dataBytePointer, ToBytePointer(data))
}
答案 0 :(得分:0)
Golang没有泛型,所以我猜你需要抓住每一种类型。
此外,在您的示例中,您获得了切片中第一个元素的第一个字节,而不是传递给函数的值的第一个字节。
答案 1 :(得分:0)
感谢您的建议,我相信我找到了我想要的东西。它可以完成,只需要稍微深入了解Go的反射包。我会回答我自己的问题,以便其他人可能会觉得这有用。
优雅的一行内容将获取任何已分配内存块的起始内存地址作为Go中的字节指针:
(*byte)(unsafe.Pointer(reflect.ValueOf(anyAllocatedDataGoesHere).Pointer()))
如果有人需要检查它对任何数据类型的行为,即[] uint32,[] byte,string,int,struct,请查看我准备的PlayGround示例。
答案 2 :(得分:0)
根据您的应用程序的不同,您可以考虑使用Gob编码或protobuf(在Brad Fitz的groupcache中使用)。你正在制作一份你的数据副本,而且我确信还有很多反映在幕后,但至少你已经得到了很好的优化复制&字节编码,这可能是一个加号,因为我怀疑一旦你有这些字节的应用程序的下一步是某种副本。