结构方法是设置字段,但没有被“保存”吗?

时间:2018-06-21 01:41:29

标签: go struct field decode

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

text := packets.NewTextPacket()
text.Buffer = bytes
text.DecodeHeader()
text.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()
}

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

1 个答案:

答案 0 :(得分:0)

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

有关简洁的说明,请参见“围棋之旅”:https://tour.golang.org/methods/4