【问题标题】:Golang: How to skip struct fields while reading from a buffer?Golang:如何在从缓冲区读取时跳过结构字段?
【发布时间】:2014-01-07 19:05:18
【问题描述】:

http://play.golang.org/p/RQXB-hCq_M

type Header struct {
    ByteField1 uint32    // 4 bytes
    ByteField2 [32]uint8 // 32 bytes
    ByteField3 [32]uint8 // 32 bytes
    SkipField1 []SomethingElse
}

func main() {
    var header Header
    headerBytes := make([]byte, 68)  // 4 + 32 + 32 == 68
    headerBuf := bytes.NewBuffer(headerBytes)
    err := binary.Read(headerBuf, binary.LittleEndian, &header)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(header)
}

我不想以块的形式从缓冲区读取头结构。我想一步读入字节域,但跳过非字节域。如果您在给定的链接 (http://play.golang.org/p/RQXB-hCq_M) 中运行程序,您会发现 binary.Read 会抛出错误:binary.Read: invalid type []main.SomethingElse

有没有办法让我跳过这个字段?

更新: 根据 dommage 的回答,我决定将字段嵌入到结构中,而不是像这样 http://play.golang.org/p/i0xfmnPx4A

【问题讨论】:

  • 你知道SkipField1的大小吗?
  • 不幸的是,skipfield1 是一个不同大小的结构切片
  • 我认为您可以定义一个新结构,该结构由指向另一个结构中三个固定长度字段的指针组成,binary.Read 会读入它。 (尚未测试且时间紧迫,因此不确定将其作为答案提交。)
  • 哦,你的 HeaderBuf 不错,++。

标签: go buffer


【解决方案1】:

您可以通过在字段名称前加上 _(下划线)来跳过字段。

但是binary.Read() 要求所有字段都具有已知大小。如果SkipField1 的长度可变或未知,那么您必须将其排除在结构之外。

然后您可以使用io.Reader.Read() 手动跳过输入的跳过字段部分,然后再次调用binary.Read()

【讨论】:

  • 您能否详细说明“io.Reader.Read() 以手动跳过跳过字段部分”
  • 我建议如果你只想阅读固定的标题部分,然后跳过标题的其余部分,然后阅读正文,我建议使用类似func (b *Buffer) Read(p []byte)func (b *Buffer) ReadBytes(delim byte)这样做。 (如果你有一个io.Reader 作为你的数据源,那么你将不得不使用ReadBuffer 方法虽然更强大。
猜你喜欢
  • 2014-07-21
  • 2022-01-17
  • 2020-11-25
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 2016-01-10
相关资源
最近更新 更多