如何写一个向量
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)
看看它是否适用于您的数据。
我是第一次使用 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)
看看它是否适用于您的数据。