如何写一个向量

How to write a vector

我是第一次使用 Go flatbuffers 接口。我发现说明很少。

我想将 uint64 向量写入 table。理想情况下,我想直接将数字存储在向量中而不知道前面有多少(我从 sql.Rows 迭代器读取它们)。我看到 table 的生成代码具有以下功能:

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"table吗?

(警告:在阅读您的问题之前我没有听说过 FlatBuffers)

如果您事先知道长度,则按照 tutorial:

中的说明存储向量
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),我会得到完全相同的输出。查看 source code,似乎 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)

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