如何写向量

时间:2019-03-23 05:34:39

标签: 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)
}

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

1 个答案:

答案 0 :(得分:4)

(注意:在阅读您的问题之前,我还没有听说过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)

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