gpt4 book ai didi

methods - Go:方法调用后对象不持久

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:33 26 4
gpt4 key购买 nike

我正在尝试为我正在编写的程序实现 MarshalBinary 和 UnmarshalBinary,但在调用 UnmarshalBinary 后,我的更改似乎并没有持续存在。

我的 MWE:

package main

import (
"encoding/binary"
"fmt"
"strconv"
)

type test struct {
var1 uint32
var2 uint32
}

func (self test) MarshalBinary() ([]byte, error) {
tmp := make([]byte, 8)
binary.BigEndian.PutUint32(tmp[0:4], self.var1)
binary.BigEndian.PutUint32(tmp[4:8], self.var2)
return tmp, nil
}

func (self test) UnmarshalBinary(data []byte) error {
self.var1 = binary.BigEndian.Uint32(data[0:4])
self.var2 = binary.BigEndian.Uint32(data[4:8])
fmt.Printf("UMB\t%s\n", self.String())
return nil
}

func (self test) String() string {
return "test struct\tvar1 = 0x" +
strconv.FormatUint(uint64(self.var1), 16) +
"\tvar2 = " + strconv.FormatUint(uint64(self.var2), 16)
}

func main() {
in := test{
var1: uint32(0x39471208),
var2: uint32(0x45387182),
}
fmt.Printf("In\t%s\n", in.String())
bin, _ := in.MarshalBinary()
fmt.Printf("Bin\t0x%x\n", bin)
var out test
out.UnmarshalBinary(bin)
fmt.Printf("Out\t%s\n", out.String())
}

我的输出:

In  test struct var1 = 0x39471208   var2 = 45387182
Bin 0x3947120845387182
UMB test struct var1 = 0x39471208 var2 = 45387182
Out test struct var1 = 0x0 var2 = 0

最佳答案

self 参数不是引用类型,因此在调用方法 test.UnmarshalBinary() 时按值复制,整个结构被复制到堆栈上,并在 UnmarshalBinary() 时释放返回。来自 Go 之旅 的幻灯片 54:

There are two reasons to use a pointer receiver. First, to avoid copying the value on each method call (more efficient if the value type is a large struct). ...

(我很难找到一个官方来源说接收者是按值传递的;有谁知道更权威的吗?)

尝试更改您的接收器以接受指针接收器:

func (self *test) MarshalBinary() ([]byte, error) {
tmp := make([]byte, 8)
binary.BigEndian.PutUint32(tmp[0:4], self.var1)
binary.BigEndian.PutUint32(tmp[4:8], self.var2)
return tmp, nil
}

func (self *test) UnmarshalBinary(data []byte) error {
self.var1 = binary.BigEndian.Uint32(data[0:4])
self.var2 = binary.BigEndian.Uint32(data[4:8])
fmt.Printf("UMB\t%s\n", self.String())
return nil
}

func (self *test) String() string {
return "test struct\tvar1 = 0x" +
strconv.FormatUint(uint64(self.var1), 16) +
"\tvar2 = " + strconv.FormatUint(uint64(self.var2), 16)
}

你会看到更好的输出:

In  test struct var1 = 0x39471208   var2 = 45387182
Bin 0x3947120845387182
UMB test struct var1 = 0x39471208 var2 = 45387182
Out test struct var1 = 0x39471208 var2 = 45387182

关于methods - Go:方法调用后对象不持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23459277/

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