我有以下代码:
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
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) }
这可行,但对我来说可读性较差。
首先,不需要隔离变量。其次,您可以在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) } }