(предостережение: я не слышал о FlatBuffers до прочтения вашего вопроса)
Если вы знаете длину заранее, сохранение вектора выполняется, как объяснено в учебнике :
name := builder.CreateString("hello")
q55310927.DatasetGridStartDatesVector(builder, len(myDates))
for i := len(myDates) - 1; i >= 0; i-- {
builder.PrependUint64(myDates[i])
}
dates := builder.EndVector(len(myDates))
q55310927.DatasetGridStart(builder)
q55310927.DatasetGridAddName(builder, name)
q55310927.DatasetGridAddDates(builder, dates)
grid := q55310927.DatasetGridEnd(builder)
builder.Finish(grid)
А что, если у вас нет len(myDates)
?На игрушечном примере я получаю точно такой же вывод, если я заменяю StartDatesVector(builder, len(myDates))
на StartDatesVector(builder, 0)
.Глядя на исходный код , кажется, что numElems
может понадобиться для выравнивания и увеличения буфера.Я предполагаю, что выравнивание может быть спорным, когда вы имеете дело с uint64, и увеличение , кажется, происходит автоматически и на PrependUint64
.
Итак, попробуйте сделать этобез numElems
:
q55310927.DatasetGridStartDatesVector(builder, 0)
var n int
for rows.Next() { // use ORDER BY to make them go in reverse order
var date uint64
if err := rows.Scan(&date); err != nil {
// ...
}
builder.PrependUint64(date)
n++
}
dates := builder.EndVector(n)
и посмотрите, работает ли он с вашими данными.