2016-04-10 2 views
0

У меня есть следующий код:Ограничить объем переменных, хранящих ошибку

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 и проверить ее в дополнительном , если блок? Например:

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) 
} 

Это работает, но выглядит менее читаемым для меня.

+0

1. Почему вы хотите его ограничить? какова ваша логика. 2. оба 'if err = ioutil.WriteFile (" text.json ", entryJson, 0644); err! = nil {} 'и' if err: = ioutil.WriteFile ("text.json", entryJson, 0644); err! = nil {} 'отлично работает – OneOfOne

+0

У меня нет особых причин, ограничивающих область действия. Это просто показалось хорошей идеей, и меня вдохновил тот курс, который я взял. (Я довольно новичок в Go, исходя из фона Java.) – Chris

ответ

2

Во-первых, нет необходимости выделять переменные. Во-вторых, вы можете сделать назначение короткого руки внутрь, если заявления, например:

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

Из того, что я понимаю в Go, что, по общему признанию, еще не так много, я считаю, что второе решение этого ответа является лучшим. В моем конкретном примере это особенно верно, так как теперь у меня есть другие методы, которые будут использовать одну и ту же логику для записи в JSON. Поэтому включение его в отдельную функцию имеет наибольший смысл и ограничивает объем. Спасибо. – Chris

+0

@Chris добро пожаловать в Go, # 1 совет, который я могу вам дать, не пытайтесь применять другие языки для Go, как только вы это сделаете, ваш опыт работы с Go будет намного лучше. – OneOfOne

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) 
     } 
    } 
} 
Смежные вопросы