2014-01-07 5 views
1

http://play.golang.org/p/RQXB-hCq_MGolang: Как пропустить поля структуры при чтении из буфера?

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: недопустимый тип [] main.SomethingElse

Есть ли способ, которым я могу пропустить это поле?

Update: основе ответа Dommage, я решил вставить поля внутри структуры вместо того, чтобы, как это http://play.golang.org/p/i0xfmnPx4A

+0

Знаете ли вы размер 'SkipField1'? –

+0

К сожалению Нет. Skipfield1 - это фрагмент структуры разного размера. – samol

+0

Я думаю, вы могли бы определить новую структуру, состоящую из указателей на три поля фиксированной длины в вашей другой структуре, и 'binary.Read' будет читать это. (Не проверял и не кратковременно, так что не уверен, чтобы представить его в качестве ответа.) – twotwotwo

ответ

1

Вы можете вызвать поле быть пропущена, предваряя это имя с _ (подчеркивание).

Но: binary.Read() требует, чтобы все поля имели известный размер. Если SkipField1 имеет переменную или неизвестную длину, вы должны оставить его вне своей структуры.

Затем вы можете использовать io.Reader.Read(), чтобы вручную пропустить часть поля пропускания вашего ввода, а затем снова позвонить binary.Read().

+0

Не могли бы вы подробнее рассказать о «io.Reader.Read(), чтобы вручную пропустить часть поля пропуска» – samol

+0

Я предполагал, что если вы просто хотите прочитать фиксированную часть заголовка, пропустите оставшуюся часть заголовка и затем прочитайте тело, я бы рекомендовал использовать что-то вроде 'func (b * Buffer) Read (p [] byte)' или 'func (b * Buffer) ReadBytes (delim byte)' для этого. (Если у вас есть 'io.Reader' в качестве источника данных, вам придется использовать' Read'. Однако методы 'Buffer' более мощные. –

Смежные вопросы