Golang for循环在break语句后不结束[关闭]

628mspwn  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(113)

已关闭此问题为not reproducible or was caused by typos。它目前不接受回答。

此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这一个是解决的方式不太可能帮助未来的读者。
9小时前关闭。
Improve this question
我正在处理一个函数如下:

func extractKeyValuePairs(taskFilePathList []string) []KeyValue {
    keyValueList := []KeyValue{}
    log.Printf("%v", taskFilePathList)
    for _, fileName := range taskFilePathList {
        file, err := os.Open(fileName)
        if err != nil {
            log.Fatal(err)
        }
        dec := json.NewDecoder(file)
        for {
            var kv KeyValue
            err := dec.Decode(&kv)
            if err != nil {
                file.Close()
                break
            }
            keyValueList = append(keyValueList, kv)
        }
    }
    return keyValueList
}

但是,当这个函数运行时,它永远不会返回。我把print语句放在这些循环中,结果是,这个函数会解码所有文件中的所有字符对,并把它附加到keyValueList中,但是这个循环永远不会退出。有没有人能提供一些线索,为什么它永远不会回来?

yyhrrdl8

yyhrrdl81#

看起来你的代码陷入了一个无限循环,因为你在解码每个文件后都没有跳出外循环。内部循环继续从文件中阅读,直到出现错误,但是当没有更多的项需要解码时,它不会退出外部循环。
要解决这个问题,您可以添加一个条件,以便在没有更多项需要解码时中断外部循环。
请尝试以下代码

func extractKeyValuePairs(taskFilePathList []string) []KeyValue {
keyValueList := []KeyValue{}
log.Printf("%v", taskFilePathList)
for _, fileName := range taskFilePathList {
    file, err := os.Open(fileName)
    if err != nil {
        log.Fatal(err)
    }
    dec := json.NewDecoder(file)
    for {
        var kv KeyValue
        err := dec.Decode(&kv)
        if err != nil {
            if err == io.EOF {
                // No more items to decode in this file, break out of the inner loop
                break
            } else {
                log.Fatal(err)
            }
        }
        keyValueList = append(keyValueList, kv)
    }
    file.Close() // Close the file after decoding all key-value pairs
}
return keyValueList

}

相关问题