我已经设法让以下函数在 Go 中运行。但是我想优化/概括代码,这样这个函数就会返回一个指向我传递给函数的任何值的第一个字节的指针。目前它只适用于 []uint32,但我想用它来获取起始内存地址作为许多其他类型(即 byte[]、int[]、string 等)的 *byte。
是否有更通用的方法来执行此操作,而不是将我需要处理的每一种类型都捕获为 case 语句?
转到以下代码的 Playground 链接: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))
}
最佳答案
感谢您的建议,我相信我已经找到了我要找的东西。这是可以做到的,只需要稍微研究一下 Go 的反射包。我会回答我自己的问题,这样其他人可能会觉得这有帮助。
在 Go 中,将任何已分配内存块的起始内存地址作为字节指针获取的优雅行将是:
(*byte)(unsafe.Pointer(reflect.ValueOf(anyAllocatedDataGoesHere).Pointer()))
如果有人需要检查它对任何数据类型(即 []uint32、[]byte、string、int、struct)的行为,请查看我准备的这个示例 PlayGround。
关于optimization - 如何在 Golang 中获取指向任何数据类型值的字节指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40329257/