bouzuya.hatenablog.com

ぼうずやのにっき

golang で err がネストしたとき

疲れている。

golang で err がネストしてしまったときや defer が使えないときの後処理をどうしようってなる。

func openTwoConnections() (*Con1, *Con2, error) {
  conn1, err := open1();
  if err != nil {
    return nil, nil, err
  }

  conn2, err := open2();
  if err != nil {
    // このへん
    if err2 := close1(conn1); err2 != nil {
      return nil, nil, err // err を返す or err2 を返す or 合わせた何かを返す
    }

    return nil, nil, err
  }

  return conn1, conn2, err
}

その関数の中で閉じて良いなら defer conn1.Close() みたいにしてしまうと良いんだろうけど……。

コールバックをとって defer するみたいな手もあるけど適用しづらい場面もあって……。


今日のコミット。