Open25

Goの学び始め備忘録

ピン留めされたアイテム
nitakingnitaking
  • Go初心者(他言語経験者)の学習の歩み
  • version
❯ go version
go version go1.19.3 darwin/arm64
nitakingnitaking

公式チュートリアルからはじめるのがよいのは知っているが、念の為chatGPTに相談したところ、同じような返答が得られる

nitakingnitaking

ちなみに A tour of Go でローカル起動できるコマンドを叩いたが、

ローカルで Go Tour を実行するためには、はじめに、 Goのダウンロードとインストール し、コマンドラインで以下のように実行します:

 go tool tour

上記のコマンドの実行に問題がある場合は手動でこのツアーをインストールして実行できます:

go get github.com/atotto/go-tour-jp/gotour
gotour

gotour ではローカルバージョンの tour を表示するウェブブラウザが開きます。
もちろん、ここのウェブサイトでGo Tourを続けてもらって構いません。

エラーになったので調べると

http://psychedelicnekopunch.com/archives/2780

エラーによると今後は go get ではなく、 go install を使いましょう。とのこと。
上記エラー文の中にある URL 先を見ると、
v17.x で go get が Deprecated になって、 v18.x から go install に変更になったみたい。

$ go install github.com/tockins/realize@latest
nitakingnitaking
nitakingnitaking

複数の戻り値

Goでは、関数やメソッドは複数の値を返すことが出来ます。これは珍しい特徴ですが、C言語の(EOFをあらわす-1のような)in-bandエラーの戻り値や、引数の変更といったような醜い構文を改善することが出来ます。

なるほど。エラーコードとエラーメッセージを同時返却できるのありがたいな・・・。
NodeでAPIレスポンス作るとき(普通に取り回せるけど)関数レベルで複数返却がサポートされているとより簡潔に記述できるので、コードの複雑度が低くなる気がする。

nitakingnitaking

バージョン管理はgvmがメジャーなのかな。

nitakingnitaking

gvmは1.19だとインストールできる

gvm install go1.19

Installing go1.19...
 * Compiling...
go1.19 successfully installed!
nitakingnitaking

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
nitakingnitaking
nitakingnitaking

Goには while、do、 untilキーワードはなく、forのみ使用できます。

nitakingnitaking

配列の興味深い特性として、サイズが型でエンコードされていることが挙げられます。 もし [5]int を期待する関数に [4]int を渡そうとしてもコンパイルできません。 これらは異なる型なので、int を求める関数に string を渡そうとするのと同じです。

なるほど

nitakingnitaking

Goの組み込みテストツールキットには、 カバレッジツールがあり、あなたがカバーしていないコードの領域を特定するのに役立ちます。私が強調したいのは、100%のカバレッジを持つことがゴールではないということです。TDD を厳格に行っていれば、100% に近いカバレッジが得られる可能性が高いでしょう。

ほ〜便利すぎる

nitakingnitaking

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だとコンパイル言語というより片付けされた動的言語に近い開発体験だから、「コンパイルエラー」「ランタイムエラー」の区分けよりも「型エラー」「エラー(ランタイムエラー)」として認識してるので、エラーの境界づけが微妙に違う感覚。

これはランタイムエラーです。 コンパイル時のエラーは、動作するソフトウェアを書くのに役立ちますが、ランタイムエラーはユーザーに影響を与えます。

nitakingnitaking

いや、あくまで感覚なんだけど。そしてgoを触れてのエラー境界のほうがDX的にもUX的にも自然だし感覚が整う。

nitakingnitaking
# 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)

ここでコンパイラがどれほど優れているかを繰り返し説明します。時間をかけてゆっくりと表示されるエラーメッセージを読むことは非常に重要です。それは長期的には役立ちます。

コンパイラ、たしかに優秀だ〜。

nitakingnitaking

Goの慣例では、レシーバー変数をタイプの最初の文字にします。
r Rectangle

これってGoの慣例だったのか〜!なんで小文字rで省略するんだろ、わかりにくいじゃんって思ってた。

nitakingnitaking

godoc

 go install golang.org/x/tools/cmd/godoc

 godoc -http=localhost:6060