英文:
Golang: How to skip struct fields while reading from a buffer?
问题
以下是翻译好的内容:
type Header struct {
ByteField1 uint32 // 4字节
ByteField2 [32]uint8 // 32字节
ByteField3 [32]uint8 // 32字节
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
英文:
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)
}
I don't want to read from the buffer into the header struct in chunks. I want to read into the bytefield in one step but skip non byte fields. If you run the program in the given link (http://play.golang.org/p/RQXB-hCq_M) you will find that binary.Read to throw an error: binary.Read: invalid type []main.SomethingElse
Is there a way that I can skip this field?
Update:
Based on dommage's answer, I decided to embed the fields inside the struct instead like this
http://play.golang.org/p/i0xfmnPx4A
答案1
得分: 1
你可以通过在字段名前加上下划线(_)来跳过某个字段。
但是:binary.Read()
要求所有字段都具有已知的大小。如果 SkipField1
的长度是可变的或未知的,那么你必须将其从结构体中省略。
然后,你可以使用 io.Reader.Read()
手动跳过输入中的跳过字段部分,然后再次调用 binary.Read()
。
英文:
You can cause a field to be skipped by prefixing it's name with _ (underscore).
But: binary.Read()
requires all fields to have a known size. If SkipField1
is of variable or unknown length then you have to leave it out of your struct.
You could then use io.Reader.Read()
to manually skip over the skip field portion of your input and then call binary.Read()
again.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论