【问题标题】:Struct method is setting field but they are not being "saved"? [duplicate]结构方法正在设置字段但它们没有被“保存”? [复制]
【发布时间】:2018-06-21 01:41:28
【问题描述】:

我知道标题令人困惑,而且它对我来说也是如此,因为它说我有从字节缓冲区解码二进制数据的数据包,每个数据值都设置为结构的特定字段。首先,我创建一个该类型的新结构并调用“解码”方法:

text := packets.NewTextPacket()
text.Buffer = bytes
text.DecodeHeader()
text.Decode()

问题是我特地调用了名为“Decode”的方法,在这里你可以看到它的作用:

func (pk TextPacket) Decode() {
    pk.TextType = pk.GetByte()
    pk.Translation = pk.GetBool()

    switch pk.TextType {
    case Raw, Tip, System:
        pk.Message = pk.GetString()
        break
    case Chat, Whisper, Announcement:
        pk.Source = pk.GetString()
        pk.SourceThirdParty = pk.GetString()
        pk.SourcePlatform = pk.GetVarInt()
        pk.Message = pk.GetString()
        break
    case Translation, Popup, JukeboxPopup:
        pk.Message = pk.GetString()
        c := pk.GetUnsignedVarInt()
        for i := uint32(0); i < c; i++ {
            pk.Params = append(pk.Params, pk.GetString())
        }
        break
    }

    pk.Xuid = pk.GetString()
    pk.PlatformChatId = pk.GetString()
}

当我在func (pk TextPacket) Decode() 中打印pk.Message 时,它会显示正确的字符串,但在text.Decode() 之后将其打印为text.Message,它会显示第一次创建结构时设置的默认值,即为空字符串,所有其他字段如text.TextType等也是如此。

【问题讨论】:

    标签: go struct field decode


    【解决方案1】:

    您正在使用值接收器,因此该方法会修改对象的副本。 换成指针接收器试试:pk *TextPacket

    请参阅 A Tour of Go 以获得简洁的解释:https://tour.golang.org/methods/4

    【讨论】:

    • 我以为我已经尝试过了,但是谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2022-08-23
    • 2017-11-21
    • 1970-01-01
    相关资源
    最近更新 更多