猿问

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

所以我试图创建一个模拟数据库,在当前的实现中,我试图创建一个插入行并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}]。


我在这里缺少什么吗?谢谢你的支持。


万千封印
浏览 73回答 1
1回答

慕沐林林

所以答案很简单。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)    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答