optimization - 如何在 Golang 中获取指向任何数据类型值的字节指针?

标签 optimization go reflection

我已经设法让以下函数在 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。

https://play.golang.org/p/G5fUOCfNCS

关于optimization - 如何在 Golang 中获取指向任何数据类型值的字节指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40329257/

相关文章:

C中使用链表的CPU缓存缺点

html - 我应该预加载折叠上方的大图像吗?

java - 优化多个 Java 数组添加

struct - 用另一个结构分配结构

reference - Go:你可以使用 range 和 slice 但得到引用吗? (迭代)

使用 Powershell 进行反射

python - 如何在 python numpy 中从周围的白色背景中裁剪对象?

mysql - 如何在GORM上使用mysql Union All?

c# - 修剪所有字符串属性

java - 禁用某些 Android Studio 编译错误