json 打破Golang无限循环

xienkqul  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(111)

我正在处理一个函数如下:

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中,但是这个循环永远不会退出。有没有人能提供一些线索,为什么它永远不会回来?
更新:我发现它不是这个功能,使程序挂起,要求管理员的帮助删除它,因为我提供的功能没有任何问题。

watbbzwu

watbbzwu1#

当你使用json解码器时,你应该检查**dec.More()**的返回值,所以你应该把无限循环改为这样:

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 dec.More() {
            var kv KeyValue
            err := dec.Decode(&kv)
            if err != nil {
                file.Close()
                break
            }
            keyValueList = append(keyValueList, kv)
        }
    }
    return keyValueList
}

相关问题