首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从字节片到带有不安全的结构的类型转换

从字节片到带有不安全的结构的类型转换
EN

Stack Overflow用户
提问于 2019-01-06 08:02:00
回答 1查看 55关注 0票数 0

我在试着理解为什么我的Go代码不能像我想象的那样工作。当我执行这个测试时,它失败了:

代码语言:javascript
复制
func TestConversion(t *testing.T) {
    type myType struct {
        a     uint8
        value uint64
    }
    myVar1 := myType{a: 1, value: 12345}

    var copyFrom []byte
    copyFromHeader := (*reflect.SliceHeader)(unsafe.Pointer(&copyFrom))
    copyFromHeader.Data = uintptr(unsafe.Pointer(&myVar1))
    copyFromHeader.Cap = 9
    copyFromHeader.Len = 9

    copyTo := make([]byte, len(copyFrom))

    for i := range copyFrom {
        copyTo[i] = copyFrom[i]
    }

    myVar2 := (*myType)(unsafe.Pointer(&copyFrom[0]))
    myVar3 := (*myType)(unsafe.Pointer(&copyTo[0]))

    if myVar2.value != myVar3.value {
        t.Fatalf("Expected myVar3.value to be %d, but it is %d", myVar2.value, myVar3.value)
    }
}

输出将为:

代码语言:javascript
复制
slab_test.go:67: Expected myVar3.value to be 12345, but it is 57

但是,如果在复制数据之前将copyFromHeader.Data1递增,那么一切都会正常工作。如下所示:

代码语言:javascript
复制
copyFromHeader.Data = uintptr(unsafe.Pointer(&myVar1)) + 1

我不明白为什么它似乎将底层数据移动了一个字节。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-06 08:23:03

avalue之间有7个填充字节。在value中,你只能得到12345 (57)的最低有效字节。当您将copyFrom下移一个字节时,myVar2.valuemyVar3.value的值都是48 (12345的第二个字节),因此测试通过。如果您将9更改为16,它应该可以工作。

是不是有什么特殊的原因让你以这种方式复制结构?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54057458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档