限制变量存储错误的范围

时间:2016-04-10 14:44:49

标签: go error-handling scope

我有以下代码:

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写入文件时,变量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) } 超出范围。 解决这个问题的惯用方法是什么?我应该只重用变量 err 并在其他 if 块中检查它吗?像这样:

<?php 
 
$args = array('post_type' => 'doors');
  
$loop = new WP_Query( $args );?>

<?php while ( $loop->have_posts() ) : $loop->the_post(); ?>

<div class="col-md-2">
<div class="entry-title"><?php the_title(); ?></div>
<div class="doormeta"><?php $doormetas = get_post_meta( $post->ID, 'doormeta', true ); 
    foreach( $doormetas as $doormeta){
    echo $doormeta['door-description'] . '<br/>';
	echo $doormeta['single-door-image'] . '<br/>'; }?></div>
	
</div>

<?php endwhile;?>

这样可行,但对我来说看起来不太可读。

2 个答案:

答案 0 :(得分:2)

首先,没有必要隔离变量。 其次,您可以在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)
    }
}

答案 1 :(得分:0)

您可以在错误检查后在else语句中写入文件,但我不能说它是惯用的/可读的。

var entry = []byte(`{
    "name": "bob",
    "age" : 74
}`)

func main() {
    if entryJson, err := json.MarshalIndent(entry, "", " "); err != nil {
        log.Fatal(err)
    } else {
        if err = ioutil.WriteFile("text.json", entryJson, 0644); err != nil {
            log.Fatal(err)
        }   
    }
}