Как написать вектор - PullRequest
       9

Как написать вектор

2 голосов
/ 23 марта 2019

Я впервые использую интерфейс Go flatbuffers. Я нахожу инструкции разреженными.

Я хотел бы записать вектор uint64s в таблицу. В идеале я хотел бы хранить числа непосредственно в векторе, не зная, сколько их будет заранее (я читаю их из итератора sql.Rows). Я вижу, что сгенерированный код для таблицы имеет функции:

func DatasetGridAddDates(builder *flatbuffers.Builder, dates flatbuffers.UOffsetT) {
    builder.PrependUOffsetTSlot(2, flatbuffers.UOffsetT(dates), 0)
}
func DatasetGridStartDatesVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {
    return builder.StartVector(8, numElems, 8)
}

Могу ли я сначала написать вектор, используя (??), а затем использовать DatasetGridAddDates, чтобы записать результирующий вектор в содержащую таблицу "DatasetGrid"?

1 Ответ

4 голосов
/ 23 марта 2019

(предостережение: я не слышал о 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)

и посмотрите, работает ли он с вашими данными.

...