Go言語の復習

Goの復習を行っている。

2年程前にちゃんと勉強したのだが、その後、使う機会に恵まれずまた忘れてしまっていた。

Goはオブジェクト指向言語ではないが、メソッドやインターフェイスがありその点は似ている。ファイルの扱い等もReaderであり、Java等の経験があれば非常に楽に学習できる。明示的なポインタがあり、デフォルトが参照渡しでなくコピーで渡したりするのでC/C++の経験があったほうが理解が速い。ただポインタのポインタやポインタの演算は無いのでC程惨いことは無い。型はそんなに強く無く、型で悩むことはそんなにない。

インストール

Getting Started - The Go Programming Language

Goはディレクトリ構成のconventionが面倒な言語でJavaに似て環境構築が面倒な所がある。GOPATHの設定等で悩む人も多いのではないだろうか。

Windowsだと以前は随分と面倒に感じたが、最近はちゃんとインストーラが存在していた。ただ、後で書く個人のディレクトリ環境構築で%userprofie%の下がデフォルト、それ以外はGOPATHの設定が必要とやらで初心者ははまるのではなかろうか。結局、WSLで入れたほうが幸せになる気がする。

Linuxだと/usr/local/goというまた変なディレクトリがデフォルトで指定されたりする。Linuxディストリビューションのパッケージマネージャーを使用するとわざわざ違う構成にしてくれてややこしい。(さらにバージョンも古くなる)。素直に/usr/local/goに本家から最新版を入れるのが問題を未然に防ぐコツじゃなかろうか。

/usr/local/go/binと~/go/binをPATHに入れておく。

Macの人はLinuxと大体同じでそんなに苦労しない。

個人の環境

goの面倒な点は個人の開発環境にもディレクトリ構成が指定されている点だ。環境変数(go env)を駆使すれば変更も可能だが、その時点で既に素人向けではない言語になっている気がする。だからGo言語を初めてのプログラミング言語にするのはあまりお勧めできない。

~/goをまず掘ってbinとsrcをその中に掘り、さらにsrcの中にtestでも掘ってその中でtest.goを書くというのが推奨、かつ余計な問題を防ぐ最初の構成になる。WindowsだとCのユーザーの中のうんぬんになって長いし、面倒だ。Windows環境変数の設定も面倒だ。正直、この辺りのためにWindowsでGoを使いたくない。WSLを入れるのが一番だろう。

使ってみると~/goの下にgithub.comとかgolang.orgとかガシガシ増えていくのでこの辺も嫌だったりする。パッケージが目に見える位置に置かれるかどうかな違いでしかないし、最近ではどの言語もパッケージはプロジェクト個別にバージョン管理するようになったのでそんなに酷い話でもないかもしれない。

Go言語でも何でもそうだが、最初は標準な環境で問題を減らして学んだほうがお得だ。環境依存の問題程、苦しいものも無い。環境依存の問題の解決は中級者以上の領域だ。学ぶ段階ではできる限り問題が起こり難い標準環境がお勧めだ。かつてJavaですらJAVA_HOMEの設定やらbinをPATHへ通すだけでも初心者が大騒ぎになったものだが、そういう意味でも本当にGo言語は初心者向けでない。プログラミングの初心者ならPythonRubyをやったほうが絶対に幸せだと思う。

復習

とりあえず、A Tour of Goが一番速いと思う。その場で実行できてしまうのでインストールの必要が無かったりするのもお勧めな点だ。ただ、演習問題は割とヒント無しでプログラミング初心者にはお勧めできない。日本語に翻訳されているのも嬉しいけれど、微妙に翻訳漏れがあったりして結局英語に戻したりもする。

A Tour of Go

右上のハンバーガーメニューで章や節に飛べる。Goの売りである並行まできちんと終わらせるのがベストだが、とりあえずGoを覚えたいだけならその手前まででも十分に使える。

これが終わったら本家のEffective Goは読んだほうが良いと思う。Goで推奨される書き方がより詳しく記載されているのでGoのお作法を学ぶのに最適だ。

Effective Go - The Go Programming Language 実践Go言語 - golang.jp

記法に悩んだら言語仕様に戻る。全部舐めて読むのはお勧めできない。検索すると多分、出る。

The Go Programming Language Specification - The Go Programming Language

他にもEssential GoやGo 101、Go by Example等、やたらとGoだけは初心者な、初心者じゃない人が高速に学習するためのサイトは多い。人気のある言語はこの辺りが本当に強い。

Essential Go - a free Go programming book

Go 101 - Go 101 (Golang Knowledgebase)

Go by Example

後はGo言語も標準ライブラリが山のようにあるのでその辺りをどのように攻略していくか次第だろうか。入門書を買うのが一番良いのだろうけど、GoDocを眺めてわかった気になって書いて、悩んで、ググるのも正しいと思う。

Standard Packages - GoDoc

この辺りになるともう書いたり、読んだりで成熟していくしかない。幸い、人気言語となったGoで書かれたプログラムは山のようにあるので好きなプログラムを読んで理解してみるのが一番、良いのではなかろうか。

日本語だとやっぱりQiitaが良いみたい。玉石混合なのでできるだけ人気の高い記事を読んだほうが良い。

Goに関する5859件の記事 - Qiita

ただのメモ

こっから本当にただのメモ。突っ込みは無用。

  • ifやswitchで代入できてscopeがそこだけなの本当に便利。他の言語もマネして欲しい
  • ifの条件式に括弧が無いのは見た目が悪くなかろうか
  • 三項演算子がまた無い。なぜ皆、嫌うのか
  • ifの{}の記述も義務なんだが事故を防ぐのは理解できても冗長で面倒。この辺りの頑さは精神的な意味で本当にJavaに似ている。
  • whileが無いの、可読性は落ちているような
  • 悪評の高いerr、設計上の支柱の無いtry-catch地獄よりはマシ
  • switchのdefaultを最初に書けて誰が嬉しいのか?
  • switchでbreakがなく、fallthroughが明示的に指定が必要なのは地味だけど素晴しい転換だと思う。他の言語にもマネして欲しい
  • method定義は関数と明示的に記法を分けたほうが良いような
  • RuneUnicode対応は本当に素敵。UTF-16の呪縛から解かれたのは新しい言語の強み
  • deferで実行される関数の引数はdefer実行時に直ぐ実行される。Effective Goのtraceの例はわかりやすく、便利に思える
  • Cとは異なりローカル変数のアドレスを返してもOK。さりげなくTourにgoの関数はclosureとの例もある。欠点として配列やsliceの要素は気をつけないとメモリリークの元にもなるようだ。
  • newとmakeの違いはnewはゼロ値の新インスタンスを作成しアドレスを返す。makeは対象がslice、map、channelに限定されゼロ値でない新値を返す(アドレスではない)。
  • "..."は配列宣言で長さを自動で設定する場合、appendで配列を可変長引数として展開する場合、関数で可変長引数を定義する場合に利用される。言語仕様では'…'が連続するcharの定義や、blockの本文省略等にも利用されていてそれとこれとは違うと書いてあるが、判別し難い
  • sliceはJavaVectorと同じでcapacityが存在しlengthと異なる。越えると勝手にcopyされるので注意が必要。複雑な例を見るとわかるがsliceが常に同じメモリ領域を差しているとは限らない。Printの%pで確認できる。
  • 配列はsliceの構成要素。配列は長さも型の一部であり代入はコピーされる。配列を引数にする場合コピーになる。アドレス渡しも可能だがお勧めされない。sliceを使え。
  • sliceはmapのkeyに使えない。sliceにはequalityがない
  • MyStringのPrintによる無限再帰の例、やりそうで怖い
  • 長くなったので分ける