Goの学び始め備忘録
- Go初心者(他言語経験者)の学習の歩み
- version
❯ go version
go version go1.19.3 darwin/arm64
公式チュートリアルからはじめるのがよいのは知っているが、念の為chatGPTに相談したところ、同じような返答が得られる
ちなみに A tour of Go でローカル起動できるコマンドを叩いたが、
ローカルで Go Tour を実行するためには、はじめに、 Goのダウンロードとインストール し、コマンドラインで以下のように実行します:
go tool tour
上記のコマンドの実行に問題がある場合は手動でこのツアーをインストールして実行できます:
go get github.com/atotto/go-tour-jp/gotour
gotour
gotour ではローカルバージョンの tour を表示するウェブブラウザが開きます。
もちろん、ここのウェブサイトでGo Tourを続けてもらって構いません。
エラーになったので調べると
エラーによると今後は go get ではなく、 go install を使いましょう。とのこと。
上記エラー文の中にある URL 先を見ると、
v17.x で go get が Deprecated になって、 v18.x から go install に変更になったみたい。
$ go install github.com/tockins/realize@latest
複数の戻り値
Goでは、関数やメソッドは複数の値を返すことが出来ます。これは珍しい特徴ですが、C言語の(EOFをあらわす-1のような)in-bandエラーの戻り値や、引数の変更といったような醜い構文を改善することが出来ます。
なるほど。エラーコードとエラーメッセージを同時返却できるのありがたいな・・・。
NodeでAPIレスポンス作るとき(普通に取り回せるけど)関数レベルで複数返却がサポートされているとより簡潔に記述できるので、コードの複雑度が低くなる気がする。
asdf-golang がよくないと言及されている記事があるので他のランタイムバージョン管理ツールを求めているが、以下のasdfプラグインもエラーになってしまった
バージョン管理はgvmがメジャーなのかな。
gvmは1.19だとインストールできる
gvm install go1.19
Installing go1.19...
* Compiling...
go1.19 successfully installed!
1.15や1.14だと失敗する(m1)
gvm install go1.15.5
Installing go1.15.5...
* Compiling...
ERROR: Failed to compile. Check the logs at /Users/satoshinitawaki/.gvm/logs/go-go1.15.5-compile.log
ERROR: Failed to use installed version
brew install go
gvm install go1.19
gvm use go1.19 --default
brew uninstall go
export GOROOT_BOOTSTRAP=$GOROOT
この通りにやって成功。結構大変なんだな〜
全然ピンときてないので、イカに移行する
以下のリポジトリで進めていっております
Goには while、do、 untilキーワードはなく、forのみ使用できます。
Exampleの仕様すごいな〜
ベンチマークテストがある!すごい
配列の興味深い特性として、サイズが型でエンコードされていることが挙げられます。 もし [5]int を期待する関数に [4]int を渡そうとしてもコンパイルできません。 これらは異なる型なので、int を求める関数に string を渡そうとするのと同じです。
なるほど
Goの組み込みテストツールキットには、 カバレッジツールがあり、あなたがカバーしていないコードの領域を特定するのに役立ちます。私が強調したいのは、100%のカバレッジを持つことがゴールではないということです。TDD を厳格に行っていれば、100% に近いカバレッジが得られる可能性が高いでしょう。
ほ〜便利すぎる
panic: runtime error: slice bounds out of range [1:0] [recovered]
panic: runtime error: slice bounds out of range [1:0]
明確に runtime error と出るとわかりやすいな・・・。
JS/TSだとコンパイル言語というより片付けされた動的言語に近い開発体験だから、「コンパイルエラー」「ランタイムエラー」の区分けよりも「型エラー」「エラー(ランタイムエラー)」として認識してるので、エラーの境界づけが微妙に違う感覚。
これはランタイムエラーです。 コンパイル時のエラーは、動作するソフトウェアを書くのに役立ちますが、ランタイムエラーはユーザーに影響を与えます。
いや、あくまで感覚なんだけど。そしてgoを触れてのエラー境界のほうがDX的にもUX的にも自然だし感覚が整う。
# hello/perimeter [hello/perimeter.test]
./perimeter_test.go:20:20: rectangle.Area undefined (type Rectangle has no field or method Area)
./perimeter_test.go:32:17: circle.Area undefined (type Circle has no field or method Area)
ここでコンパイラがどれほど優れているかを繰り返し説明します。時間をかけてゆっくりと表示されるエラーメッセージを読むことは非常に重要です。それは長期的には役立ちます。
コンパイラ、たしかに優秀だ〜。
Goの慣例では、レシーバー変数をタイプの最初の文字にします。
r Rectangle
これってGoの慣例だったのか〜!なんで小文字rで省略するんだろ、わかりにくいじゃんって思ってた。
godoc
go install golang.org/x/tools/cmd/godoc
godoc -http=localhost:6060