新しい言語を覚えると必ず xx言語なら簡単にできるのに! というクレームを抱くはず
その負の感情をネットに書くと反感を食らうので文句を言わずに覚えるからストレスがたまる
あえて Disりながら言語を覚えれば 精神的に楽で長続きする
むしろ Disることを目的にして 結果的に言語を覚えてしまうというのが 理想かもしれない
ので あえてGoをDisりながら覚えよう!
#名前がKuso
GoogleだからGoなのはわかるが
Go
は短く 英語では 行く
という動詞らしく、いっぱい他のものがヒットする
ポケモンGO しかりだ
以前あった MicrosoftのCOMよりはいくぶんマシではあるが
検索エンジンの会社のくせに、SEO対策が出来てないと思われる
まー Google様の力で Go
で検索したら GoLangが上位に来るようになってるが
そのために無駄な最適化強いられたんじゃないだろうか?
Go
では他のものがヒットするので Golang
Go言語
で検索する必要がある
#環境変数がKuso
GOには環境変数が3つある
##$GOROOT
Goをインストールするディレクトリだ。
間違えないでほしいのは インストールしたディレクトリではなく インストールする ディレクトリだ
今は特に指定しなくてもよくなっている
指定しない場合は 勝手に適切なところにインストールされる
##$GOBIN
Goの実行ファイルのあるパスだ
これを環境変数 $PATHに追加すれば go
コマンドが パスなしで使えるようになる
##$GOPATH
これが厄介者!!
Go1.8からは 無指定の場合は $HOME/go(Windowsは C:¥Go) を指定したとして扱われるが
基本的には指定するべきだ
このパスは何かというと
Goで開発するコードはすべてこの下に置け! という傲慢な設計である
$GOPATH以外に置いたコードは Buildしようとしても パスが違うと怒られBuild出来ない
たとえ インターネットで拾ったサンプルを実行するにも、デスクトップやダウンロードフォルダでビルド出来ず
わざわざ $GOPATH 以下にコピーして そこでBuildしなければならない
また、更におせっかいなのが、このパス構造が決められているということだ
$GOPATH/bin にビルドされた実行ファイルが置かれ
$GOPATH/pkg 以下に、パッケージごとの中間ファイルが置かれ
$GOPATH/src 以下に、ソースコードを置く必要がある
また、pkgやsrcディレクトリ以下も ディレクトリの制限がある
src/github.com/ユーザ名/アプリ名
というディレクトリ構成でおかなければ 色々と不具合がある
Git以外のサービスを使っていれば src/bitbucket.com/ユーザ名/アプリ名 など。
基本的に GoはGithubなどのOSSプロジェクトを対象にしているため
それ以外のディレクトリで開発する場合は色々と苦労を伴う
まさにKusoだ
#パッケージのimport
パッケージのimportは srcフォルダを基準に行われる
例えば Githubのxxxさんの作ったyyy というライブラリを使うのであれば
importに github.com/xxx/yyy を追加する
go get を使えば上記のパッケージをダウンロードして $GOPATH/src/github.com/xxx/yyy に置いてくれる
便利だ
では 作ってるアプリ内のライブラリを指定するときはどうなるか?
たとえば ./lib/hoge をimportしよう
相対パスを使い import lib/hoge と書くこともできるが、毎度パッケージのビルドが走ったり、go getで取れないので
やめたほうがいいようです
素直に アプリ内のパッケージも
import github.com/xxx/yyy にしましょう
このあたりは下記でも述べられている
https://qiita.com/shopetan/items/eddcacec21cc7ea274f9
まさにKusoだ
##パッケージのバージョン指定は?
できません!
Kuso
Goからの回答としては
パブリックなライブラリに関しては最新版ですべてのバージョンで動くべきだ
互換性を捨てる場合はライブラリ名を変えるべきだ
とのことです。。
そんなの無理に決まってる!!
ということで、ほしいバージョンのパッケージをダウンロードし 名前をかえてコピーしておきます
例えば $GOPATH/src/github.com/xxx/yyy2
そして そのファルをimport すれば出来ます
なんて アナログ!!
Kuso
ってことで 外部の人が試行錯誤し色んなパッケージ管理ツールを作ってくれました
go1.11では vgoというものが試験的に導入されたらしい
https://tanksuzuki.com/entries/golang-vgo/
これで一歩 まともな言語に近づいてきたね!
##GitLabのサブルグループを使う場合
たとえば Gitlabのサブグループで開発すると
import gitlab.com/ユーザ/サブグループ/アプリ
と 1階層増えます
すると 下記のように そのままでは go get出来なく不便です
https://qiita.com/zatsuzatsu/items/f15c6dff88d053d46c43
そのため、うちではGoのみ Gitlabはサブディレクトリ使わない運用になってます
Kuso
上記は新しいバージョンで未確認なので なおってればいいな・・・
#Docker
Dockerでアプリケーションをマウントさせるとき よくあるのは下記のように アプリディレクトリ作ってそこに置く
WORKDIR /app
ADD . /app
コンテナ上の$GOPATHがこの場合 /appに置くことになるが
内部ライブラリのimportが
import github.com/user/app/xxx
になっているはずなので、これではうまくいかない
試行錯誤したあげく 下記のようにする必要があった
WORKDIR $GOPATH/src/github.com/user/app
ADD . $GOPATH/src/github.com/user/app
深い・・
ので この後 $GOPATH/bin/app を /app にコピーする などして使う事になるかもしれない
ちょっと面倒