我已经学习了如下代码

func str2bytes(s string) []byte {
    x := (*[2]uintptr)(unsafe.Pointer(&s))
    h := [3]uintptr{x[0], x[1], x[1]}
    return *(*[]byte)(unsafe.Pointer(&h))
}

此功能是在不进行阶段复制数据的情况下将string更改为[]byte

我尝试将num转换为reverseNum
type Num struct {
    name  int8
    value int8
}

type ReverseNum struct {
    value int8
    name  int8
}
func main() {
    n := Num{100, 10}
    z := (*[2]uintptr)(unsafe.Pointer(&n))
    h := [2]uintptr{z[1], z[0]}
    fmt.Println(*(*ReverseNum)(unsafe.Pointer(&h))) // print result is {0, 0}
}

这段代码没有得到我想要的结果。
谁能告诉我有关

最佳答案

太编译了。
更简单

package main

import (
    "fmt"
    "unsafe"
)

type Num struct {
    name  int8
    value int8
}

type ReverseNum struct {
    value int8
    name  int8
}

func main() {
    n := Num{name: 42, value: 12}

    p := (*ReverseNum)(unsafe.Pointer(&n))

    fmt.Println(p.value, p.name)
}

输出“42,12”。

但是,真正的问题是,为什么在地球上您想进行这种欺骗而不是复制在任何明智的CPU Go程序上立即完成的两个异常字节?

您的方法的另一个问题是iit_a中的IIUC不能保证两个具有相同字段的类型必须具有相同的内存布局。我相信他们应该在大多数实现中使用,但是我认为他们并不需要这样做。

还要考虑一下看似无害的事情,例如在您的数据类型中也有一个额外的字段(甚至是struct{}!类型),可能会对这些类型的变量的内存布局造成Go language specification interesting的影响,因此,假设您可能会重新解释以下内容的内存可能会很危险。按照您想要的方式去变量。

关于go - 如何理解uintptr和struct之间的关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61078591/

10-13 02:44