2023/04/07

いにしえのGo

春のGolangおさらい祭り

いま golangをはじめると、1.20ではじめると思う。しかし、世の中にはいにしえのGoの情報もあふれている。オフィシャルに近いドキュメントでもすべてが最新ではないので注意がいる。古い情報を無視する技術は初学者にとってかなり重要であるが、なにせ学びはじめではハードルが高い。なので、古い情報を無視するためのポイントをまとめておく。

Goのリリース履歴はここで見ることができます。

The Go Programming Language Release History

GOROOT / GOPATH

GOROOT には、Go SDK のパス(/usr/lib/go-1.20 とか) を設定します。複数の Goバージョンを使って開発をするのでなければ、一度設定したら変更する必要はないでしょう(同じSDKを使っていれば)。

GOPATH はデフォルトではユーザのホームディレクトリにある go/ になります($HOME/go とか ~/go ということ)。以前はGoプロジェクトの置き場所が、$GOPATH/src 配下に限定されていましたが、現代では自由。

GOROOT/GOPATH はデフォルトの設定でおおむね良いが、Go SDKのインストール方法によっては期待値ではないものになっているかもしれないので、その場合は正しく設定が必要。

環境変数 GO111MODULE

かつては GOPATH mode (GOPATHモード) と module-aware mode (モジュールモード) という2つのモードがあり、その切り替えのために 環境変数 GO111MODULE が利用されていたが、いまは必要ない(1.16からデフォルトがモジュールモード)。

必要ない、と書いたが実は GO111MODULE を利用することはできる。とはいえ利用する必要は基本ない。

現代においては go mod でモジュールの管理をする。

go get / go mod tidy / go install

1.16以降では、go get すると、go.mod/go.sum が更新されて新規モジュールであればダウンロードもされる。go mod tidy すると go.mod/go.sum が更新されて、必要なライブラリ群が $GOPATH/pkg にダウンロードされ、不要になるものがあれば削除もされる。

また、go install で、$GOPATH/bin にバイナリがインストールされる。goを利用したCLIコマンドなどのインストールは go install コマンドで行う。ライブラリ コマンドをインストールする目的で書かれている go get は古い。READMEのインストールコマンドが更新されていないCLIコマンドはけっこう見かける。ライブラリは go get するが(go mod tidy)、コマンドのインストールは go install

any

interface{} は any と書けるようになっている。型ではない方の interface との混乱を避ける意味でも個人的には any と書く方が好み。でも、すでに interface{} と書いてきているプロジェクトの場合は全て書き換えるのでなければ突然 any を混ぜるのはやめた方がいいと思う。

interface{}any は機能的には等価なので、解説を読むときはそのまま置き換えて読めば良い。ただし、ライブラリで any を使ってしまうと古いgoランタイムで対応できないことがあるかもしれない。

golintは古い

現代は golangci-lint に好みの linter をいろいろ設定して使うのが良い様子。(私はまだ staticcheck単体でしかつかっていないが)

長らくデファクトスタンダードの位置にいた golint はすでに更新されなくなっている。

非推奨になったパッケージ

io/ioutil とか io/fs とか、ユースケースの多そうなものも Deprecated になっていたりするが、VSCodeなどを使っていれば警告がでると思うので気づいたら代替品を探す。

配列が %s にアサインできない

配列は fmt.Printf なんかのフォーマット verb でいうところの %s にいれるとエラーになっていた時代があったようす。

現代は問題ない。

Ptr

現代は Pointer と省略しないで書くようす。


以上、間違えてるのがある気がしますが、入門直後に出会うのはこのへんですかね。おつかれさまです!

サイト内検索