如何写一个向量

sha*_*unc 3 go flatbuffers

我第一次使用 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)
}
Run Code Online (Sandbox Code Playgroud)

我可以先使用 (??) 编写向量,然后DatasetGridAddDates将结果向量记录在包含“DatasetGrid”的表中吗?

Vas*_*nov 5

(警告:在阅读您的问题之前,我还没有听说过 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)
Run Code Online (Sandbox Code Playgroud)

现在如果你没有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)
Run Code Online (Sandbox Code Playgroud)

看看它是否适用于您的数据。