gpt4 book ai didi

go - 如何理解uintptr和struct之间的关系?

转载 作者:行者123 更新时间:2023-12-01 22:42:34 36 4
gpt4 key购买 nike

我已经学习了如下代码

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/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com