一尘不染

限制变量存储错误的范围

go

我有以下代码:

if entryJson, err := json.MarshalIndent(entry, "", " "); err != nil{
    log.Println(err)
} else {
    log.Println(entryJson)
}

if err := ioutil.WriteFile("text.json", entryJson, 0644); err != nil {
    log.Println(err)
}

我想尽可能地限制 err 的范围。我要面对的问题是,entryJson当我想将变量写入文件时,变量超出了范围。
处理这个问题的惯用方式是什么。我应该只重用变量 err 并在其他 if 块中检查它吗?像这样:

entryJson, err := json.MarshalIndent(entry, "", " ")
if err != nil{
    log.Println(err)
} else {
    log.Println(entryJson)
}

err = ioutil.WriteFile("text.json", entryJson, 0644)
if err != nil{
    log.Println(err)
}

这可行,但对我来说可读性较差。


阅读 209

收藏
2020-07-02

共1个答案

一尘不染

首先,不需要隔离变量。其次,您可以在if语句中进行简写分配,例如:

entryJson, err := json.MarshalIndent(entry, "", " ")
if err != nil{
    log.Println(err)
} else {
    log.Println(entryJson)
}

if err = ioutil.WriteFile("text.json", entryJson, 0644); err != nil{
    log.Println(err)
}

// or if you want to limit the scope of err badly, this is also legal:

if err := ioutil.WriteFile("text.json", entryJson, 0644); err != nil{
    log.Println(err)
}

处理此特定示例的一种干净方法是将其放入自己的函数中并调用它:

func writeJSON(fn string, v interface{}) error {
    j, err := json.MarshalIndent(v, "", " ")
    if err != nil {
        return err
    }

    return ioutil.WriteFile(fn, j, 0644)
}

func main() {
    var test struct {
        A string
        B string
    }
    if err := writeJSON("file.json", test); err != nil {
        log.Fatal(err)
    }
}
2020-07-02