Pocket
LINEで送る

deferが謎です。ソケット通信のプログラムをつくってみてるんですが、色んな所に書いてある下記部分で、絶対エラーがでます。といっても実行するとエラーにならないのですが、Vimに組み込んでる、GoErrCheckがエラーといってきます。きっと何かおかしいんだと思いました。

def conn.Close()

わかりやすいサイトを見つけました。
http://www.blevesearch.com/news/Deferred-Cleanup,-Checking-Errors,-and-Potential-Problems/

GoErrCheckは、関数を使った時にリターンを受け取るように書かないとエラーをだすのですが、それのことのようです。conn.Close()は結果の成否をリータンするのでそれを受け取らなくてはいけませんでした。しかし、そうなると単純にdefer err := conn.Close()と書けなくなるので、下記のようにします。

defer func() {
  err := conn.Close()
  if err != nil {
    log.Fatal(err)
  }
}()

上記を下記のようにすると便利

conn, err := net.DialTCP("tcp", nil, tcpAddr)
defer Close(conn)

Close関数を別でつくる。

func Close(c io.Closer){
  err := c.Close()
  if err != nil {
    log.Fatal(err)
  }
}

Close関数の引数は、Closerインターフェースを持ってるやつということだと思うので、上記のconnでも使えると思う。log.Fatalはいらないケースも多いのかなと思いました。deferが呼び出された時点のconnが使われるので、複数のconnがある場合も、引数に入れることでそれぞれのconnに対応できるようになるようです。

Pocket
LINEで送る

カテゴリー: プログラミング

コメントください

関連記事

プログラミング

Go言語によるビットコインのフルノード実装btcdを調べる(2)

btcdを実行した際のプログラムの流れを最初から確認してみます。 se 続きを読む …

プログラミング

Go – leveldb

Goで使えるLevelDB。 syndtr/goleveldb ドキュ 続きを読む …

%d人のブロガーが「いいね」をつけました。