Golangのreturnではずかしい凡ミスにはまるの巻


ちゃんと理解していなかったのでハマったという類いのものです。

こんな感じの関数を書いたとします。

func hoge() (sub int)
  for _,row := range rows {
    if r.MatchString(row[0]) {
      return // <- 本当は continue と書きたかった
    }
// ....
}

continue と書くべきところをなぜかうっかり return と書いてしまいました。 で、本来ならループ内の各要素を1つ飛ばす、という挙動にしたかったところが、 関数ごと飛んでいたわけです。(アホですね)

名前付き返り値が宣言されているので

return sub

都同じことになり、Golangのお約束として初期化されたintは0なので、

return 0

ということになるわけですね。


もしこれが名前付き返り値でなければ、想定通りエラーになっていたはずです。


「A Tour of Go」でも結構最初の方に書かれている基本的なところのはずですが、すぐ気付かないとは精進が足りませんね…。 https://tour.golang.org/basics/7

最新記事

すべて表示

SQLite(sqlite3)で “no such table”

小ネタです。 SQLiteを使っていて "no such table" とエラーが出た場合、 DBファイル名の指定が空になっている、という凡ミスを起こしていないかを確認してみましょう。 ・・・ そういう凡ミスをしてしばし悩んだので… ファイル名の指定が空になっている場合、一時的なインメモリDBとして保存されます(※1)。 つまりDB接続を切断すると中身は消えます。 なので接続

アプリケーションサーバにポートを指定せずに起動すると?

最近、 Goで書かれたアプリケーションサーバが起動しない! ->原因: .env ファイルが欠けていた というドタバタがありました。 結局Goと関係ないですが、この時、 「あまりGoに慣れてないのでGoの問題かと…」「DockerまだよくわかってなくてDockerの問題かと…」 というような声があったのて、あえてGoで検証してみようと思ったわけです。 さて、Goでサーバサイドのシステムを作

GitLab 9.1.2 (MySQL) を 11.4.0 (PostgreSQL) にアップグレード

弊社ではかなり前からGitLab(CE)を自社環境で運用しているのですが、ふと気付くと、バージョンがだいぶ先に行ってしまっていました。 とくに最近のバージョンでは Auto DevOps なども使えるようになっていたりするので、さすがにそろそろキャッチアップしたいと考えたわけです。 現行の環境は次の通りです: GitLab 9.1.2 sameersbn/gitlab 使用 MySQL 5.6