登录
首页 >  Golang >  Go问答

理解uintptr与struct之间的联系的方法是什么?

来源:stackoverflow

时间:2024-02-26 11:54:23 229浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《理解uintptr与struct之间的联系的方法是什么?》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

问题内容

我学习了如下代码

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 程序上都会立即完成?

您的方法的另一个问题是 iiuc Go language specification 中没有任何内容保证具有看似相同字段的两种类型必须具有相同的内存布局。我相信他们应该在大多数实现中,但我不认为他们需要这样做。

还要考虑到看似无害的事情,例如数据类型中还有一个额外的字段(甚至是 struct{} 类型!),可能会对这些类型的变量的内存布局产生 interesting things 的影响,因此,假设您可以按照您想要的方式重新解释 go 变量的内存,这可能是非常危险的。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>