所以我试图创建一个模拟数据库,在当前的实现中,我试图创建一个插入行并insert返回它们。我决定使用 a来帮助维护一个内存块,我可以在其中插入一行行,并在调用时反序列化该内存块,但它似乎只返回第一行而不是传递给数组的所有行。selectselectbytes.Bufferselectselect主程序func main() { inputBuffer := compiler.NewInputBuffer() scanner := bufio.NewScanner(os.Stdin) for { PrintPrompt() scanner.Scan() command := scanner.Text() inputBuffer.Buffer = command if strings.HasPrefix(inputBuffer.Buffer, ".") { switch compiler.DoMetaCommand(inputBuffer) { case compiler.MetaCommandSuccess: continue case compiler.MetaCommandUnrecognizedCommand: fmt.Printf("Unrecognized command %q \n", inputBuffer.Buffer) continue } } var statement compiler.Statement switch compiler.PrepareStatement(inputBuffer, &statement) { case compiler.PrepareSuccess: case compiler.PrepareUnrecognizedStatement: fmt.Printf("Unrecognized command at start of %q \n", inputBuffer.Buffer) continue case compiler.PrepareSyntaxError: fmt.Println("Syntax error. Could not parse statement.") continue } compiler.ExecuteStatement(statement) fmt.Println("Executed") }}func PrintPrompt() { fmt.Printf("db > ")}上面的代码用于解析条目并将其附加到语句中,并且根据关键字,它是一个insert或select[取出用于定义枚举的代码并保留核心逻辑]func SerializeRow(r []Row) { encoder := gob.NewEncoder(&RowsTableBuffer) err := encoder.Encode(r) if err != nil { log.Println("encode error:", err) }}所以上面的代码使用了一个全局变量,buffer在这个全局变量中,slice附加到 in 的PrepareStatement()内容将在 an 完成后进行编码insert。Aselect应该返回所有行的切片,但出于某种原因只返回第一个元素。示例(在终端中):如果我插入 2 个: db > insert 1 john c@mail.com db > insert 2 collins k@mail.com然后我做了一个选择: select =>它只返回[{1 john c@mail.com}]。我在这里缺少什么吗?谢谢你的支持。
1 回答
慕沐林林
TA贡献2016条经验 获得超9个赞
所以答案很简单。encoder我们在函数中创建一个新的SerializeRow而不是创建一次。我们把它从函数中拉出来并创建了一个全局的。
var (
encoder = gob.NewEncoder(&RowsTableBuffer)
decoder = gob.NewDecoder(&RowsTableBuffer)
)
func SerializeRow(r Row) {
err := encoder.Encode(r)
if err != nil {
log.Println("encode error:", err)
}
}
func DeserializeRow() {
var rows Row
err := decoder.Decode(&rows)
for err == nil {
if err != nil {
log.Fatal("decode error:", err)
}
fmt.Printf("%d %s %s\n", rows.ID, rows.Username, rows.Email)
err = decoder.Decode(&rows)
}
}
- 1 回答
- 0 关注
- 72 浏览
添加回答
举报
0/150
提交
取消