为了账号安全,请及时绑定邮箱和手机立即绑定

gob 解码器只返回数组中的第一个元素

gob 解码器只返回数组中的第一个元素

Go
万千封印 2022-11-28 17:02:39
所以我试图创建一个模拟数据库,在当前的实现中,我试图创建一个插入行并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)


    }


}


查看完整回答
反对 回复 2022-11-28
  • 1 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信