我已经学习了如下代码
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/