質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

1回答

3328閲覧

errを使い回す場合の書き方

Auxo

総合スコア34

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2018/02/08 03:18

編集2018/02/08 03:59

golangを勉強しています。

golangではエラーハンドリングは主に以下のような書き方をすると思います。

go

1f, err := os.Open("sample.txt") 2if err != nil { 3 panic(err) 4}

多くの場合で上記のように「err」をエラーのハンドリングに利用する事と思います。

単純なプログラムであれば良いのですが、多少複雑になってくると1つの関数内で複数のエラーハンドリングが必要となります。

その場合、初期化と同時に受け取るという事はできないため、異なる名前をつけた変数で受け取るか、または予め初期化し変数の受け取りのみ行うかという事になるかと思います。

ただ、実際にはエラーと同時に正常時の結果も受け取る為、もしも予め初期化を行っている場合は、結果の受け取りについても別途初期化が必要となり、記述が多少煩雑になります。

このような場合どのような書き方をするのが適切なのでしょうか。

<追記>

例えば以下のようなケースではどうでしょうか?

go

1package main 2 3import ( 4 "fmt" 5 "time" 6 "strconv" 7 "encoding/json" 8 9 "github.com/go-redis/redis" 10) 11 12func main() { 13 14 client := redis.NewClient(&redis.Options{ 15 Addr: "127.0.0.1:6379", 16 Password: "password", 17 DB: 0, 18 }) 19 20 now := time.Now() 21 22 data := map[string]interface{} { 23 "key": "foo", 24 "value": "bar", 25 "time": strconv.FormatInt(now.Unix(), 10), 26 } 27 28 bytes, err1 := json.Marshal(data) 29 if err1 != nil { 30 panic(err1) 31 } 32 33 err2 := client.RPush("VALUES", string(bytes)).Err() 34 if err2 != nil { 35 panic(err2) 36 } 37 38}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mattn

2018/02/08 03:23

コード例を用いてどの様なケースが煩雑か書いて貰って良いですか。
Auxo

2018/02/08 04:02

例を追加しました。よろしくお願いします。
guest

回答1

0

ベストアンサー

Unmarshal 時の err は panic 以降使われないので再利用するのはどうでしょうか。

go

1package main 2 3import ( 4 "fmt" 5 "time" 6 "strconv" 7 "encoding/json" 8 9 "github.com/go-redis/redis" 10) 11 12func main() { 13 14 client := redis.NewClient(&redis.Options{ 15 Addr: "127.0.0.1:6379", 16 Password: "password", 17 DB: 0, 18 }) 19 20 now := time.Now() 21 22 data := map[string]interface{} { 23 "key": "foo", 24 "value": "bar", 25 "time": strconv.FormatInt(now.Unix(), 10), 26 } 27 28 bytes, err := json.Marshal(data) 29 if err1 != nil { 30 panic(err1) 31 } 32 33 err = client.RPush("VALUES", string(bytes)).Err() 34 if err != nil { 35 panic(err2) 36 } 37 38}

投稿2018/02/08 04:47

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Auxo

2018/02/08 06:02

再利用は最初に考えたのですが、その場合構造が変化、例えば最初に初期化を行っている「err」の箇所が変更となった場合に、初期化の箇所を都度変更(とはいえ、それほど構造が変化するという事の方が問題ですが)する必要があり、もっとエレガントな書き方がないものかと考えていました。 もう一つはスコープを切る為だけにクロージャーとして記述する方法ですが、単純な処理のケースでは無駄な記述が増え、golang的ではないのかなと考えています。 「これだ!」という書き方はないという事で理解しました。 適宜判断して再利用するか、スコープを切るか使い分けしたいと思います。 ありがとうございました。
mattn

2018/02/08 06:48

なるほど。であれば戻り値を受ける変数を関数の冒頭で宣言してしまうという方法もあります。ただこの場合、型を明示しないといけなくなるので面倒ではありますが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問