底辺技術者の備忘録とポエムと

IT関係の学習メモや妄想あるいは愚痴的な何かをつらつらと。

Go言語復習を再開しないと!そして社内教育進めないと!!

気がついたらば、もう10月が終わってしまう。 前回Goを再度基礎から学習しておこうと思って記事を2つばかり書いてからはや3ヶ月が経過してしまっている状況に、、、

これはよろしくないな、と思っていながら日々の業務に追われて、またブログなどには一切書いていないですが、VueやReactなどの技術検証など浮気をしていたりで、、、気がつくとここまで時間が流れてしまっていたわけです。

なのですが・・・こういう時に限ってね、案件としてGoを導入するのが良いと思える案件が転がり込んでくるものなのですよね。 そうなのです!ついに!念願の(?)実案件でGo言語を使う機会が出てきたのです!

作るものとしてはゲートウェイとなるようなAPIサーバ機能でUIは関与しません。 ただ、軽量なやりとりが大量に、かつそれなりの同時接続数になる見込み。 ハード的にもそこまでコストが回せなさそうな状況が見えてきている。 、、、など、詳細までは語れませんが、諸々考えるとGoで実装するのが「わかりやすい」状況なのです。

Goの場合には、ライブラリの状況などをきちんと見ておかないと、案外自分で実装する範囲が多くなることもありますが、今回求められている機能的な要件(現状では要件というより、まだまだ要求・要望レベルですけどね〜)であれば、標準ライブラリとawesome goなどで見つかるような、割と知られているライブラリを用いることで、業務実装に専念できそうだし、とりあえずまずは叩きレベルで先にプロトのためのプロトレベルの実装をしてみようと思います。

合わせて、Goの学習記事も続編を掲載していこうと思います。

Goの世界よこんにちは。

昨日用意した環境を用いて、早速基本的なGo言語の学習に入ろうと思います。

こんにちは世界!

はじめに昔から慣例として存在しているHello Worldを、Go言語で行ってみます。任意の場所にhello_world.goというファイルを作成し、以下のようにコードを記述し保存します。

<hello_world.go>

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello World")
}

ターミナルなどでファイルの保存してあるディレクトリに移動し、以下のようにファイルの実行を行います。

$ go run hello_world.rb
>> Hello World

(>>に続いて記載してある内容はプログラムの実行結果です。以後、プログラムなどの実行結果に続いて>>から始まる記載がある場合には、実行結果として読んで下さい。)

無事Go言語の最初のプログラム実行ができました。 実際のシステム開発で実装されるようなコードから見ると何の役にもたたないような小さいプログラムですが、Goでコーディングを行う際に必要ないくつかのことを提示してくれています。

Hello Worldに見るGoプログラムの決まりごと

  • プログラムは何かしらパッケージに属する必要がある。
  • パッケージの指定は package パッケージ名と記述する。
  • プログラムの開始の対象=エントリーポイントは、mainパッケージのmain関数である。
func main() {
  処理
}
  • プログラムで記載するために必要なパッケージを利用する場合、import宣言で明示的に指定する必要がある。
  • import 宣言はimport "パッケージ名"あるいは
    import (
     ”パッケージ名”
     ”パッケージ名”
     ”パッケージ名”
    )

プログラムの実行方法

先ほどの記述ではgo run hello_world.rbのようにプログラムを実行しました。このやり方の場合、goはimportに記載されているパッケージだけ読み込み、その場でビルドと実行を同時にしてくれます。ただし、プログラム全体がディレクトリに別れている場合など、きちんと実行ができないケースがあるため、そのような場合には、ビルド -> 実行のように分けるようにします。

Go言語でビルドを実行する場合にはgo buildを使います。ビルドを実行すると、実行可能なバイナリが作成されます。

実行前のディレクトリのファイルリスト

$ ls
hello_world.go 

ここで前述のbuildを実行します。

$ go build hello_world.go

実行後のディレクトリのファイルリスト

$ ls
hello_world           hello_world.go

hello_worldというバイナリファイルが作成されています。 このファイルを実行することで、先ほどのgo run の実行結果と同様の結果が得られます。

$ ./hello_world
Hello World

go buildの実行時にバイナリファイルのファイル名を指定することもできます。ビルド時にオプション-o ファイル名を指定することで、指定のファイル名でバイナリが書き出されます。試しに、「hello_go」 というバイナリファイルとして書き出すようにしてみます。

go build -o hello hello_world.go

オプション指定ビルド実行後のディレクトリのファイルリスト

$ ls
hello                 hello_world           hello_world.go

上記のような基本的な使い方以外に、go buildはクロスコンパイルなども可能ですが、詳細は必要になった場合改めて書くことにします。

次は、Goで利用するのとのできる基本的な型や変数、関数の基本などを学習して行きます。

Go言語はじめました

私は普段の業務で主にRuby/Rails、あるいはJava(それもSWTJavaFXなどのクライアントものが多い)を使った、いわゆる業務系システムを構築することが多いのです。

Railsだけど業務系。。。と言われるのかな。。。 (Railsでもそこまでシビアな要求がない場合十分に業務系システムは作れます。当然デメリットもありますが、十分にメリットもあるのです。)

なのですが諸々思うところがあり、Go言語を本格的に学習し、一先ずお試し社内ツールをいくつか作っていこうと思いたちました。 ということで、その記録を「主には自分用の備忘録」として、はてブで残していこうと思います。

ちなみに、GoはサーバサイドのAPIを作るために使います。フロントエンドは今の所Reactを使って構築する予定です。 これまでJavascript関係は自作の簡易なFrameworkで半SPAを扱った程度のため、ReactもGoと合わせて今後みっちり学習して行くことになります。

Goの開発環境を整備する

何はともあれ、環境がなければ話になりませんので、自機PC(MacBook Pro Retina, 15-inch, Mid 2015)に環境を作り込みます。 これまでは主にParalleles上にUbuntu/WIndows環境を用意し開発をしていたのですが、これを機にRubyPythonJavascript、Goの環境を全てMacOS上に移行してしまいます。これにあたり言語のバージョン問題やらで面倒臭いことになりたくないので、

  • anyenvで*env環境を導入する。
  • Go言語はgoenvを使って構築する。

また、IDEやエディタなどのツールに関しては、

  • Visual Studio Code(今後VSCodeと表記)を使用する。
  • よほどのことがない限りVSCodeだけで、全ての開発作業を行う。

という感じにします。 以下手順です。

anyenvを導入する

$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.your_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.your_profile
$ exec $SHELL -l

詳細は、公式サイトを参照の事

goenvを導入する

$ anyenv install goenv
$ exec $SHELL -l

これでGo言語のインストールを行う準備ができました。 goenvを使ってインストールする事のできるGoのバージョンは、以下のコマンドで確認できます。

$ goenv install --list

実行すると以下のように出力されます。(あくまでも記事作成時の表示内容です。コマンドの実行タイミングよっては内容は変わります。)

Available versions:
  1.2.2
  1.3.0
  1.3.1
  1.3.2
〜 中略 〜
  1.9.7
  1.10.0
  1.10beta2
  1.10rc1
  1.10rc2
  1.10.1
  1.10.2
  1.10.3
  1.11beta2

今回は1.10.3をインストールします。

$ goenv install 1.10.3

実行ごしばらくすると、インストールが完了しますので、その後以下のコマンドを実行し、標準で利用するGo言語のバージョンを1.10.3に固定します。

$ goenv global 1.10.3

これでGo言語が利用できる状態になります。 試しにバージョン情報を出力してみます。

$ go version
go version go1.10.3 darwin/amd64

最新のGoはGOPATHを指定しなくても、$HOME/goを自動的にGOPATHとして利用してくれますが、go getしたあと$HOME/go/bin配下のコマンドを円滑に使うために、以下の通り環境変数を編集しておきます。指定はこれと決まったファイルはありませんが、私は.bash_profileに記載しています。

export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin

良い感じにVSCodeで開発するための設定

デバッグをどうするのか、という問題は後においておくと、基本的なことはMicrosoftが提供してくれている拡張機能「Go for VIsual Studio Codeをインストールすれば良いかなと思います。ただ、この拡張機能はいくつかのGoのライブラリを使うことを前提としていますので、以下の通り必要なものをインストールしてしまいます。

$ go get -u -v github.com/ramya-rao-a/go-outline
$ go get -u -v github.com/acroca/go-symbols
$ go get -u -v github.com/mdempsky/gocode
$ go get -u -v github.com/rogpeppe/godef
$ go get -u -v golang.org/x/tools/cmd/godoc
$ go get -u -v github.com/zmb3/gogetdoc
$ go get -u -v github.com/golang/lint/golint
$ go get -u -v github.com/fatih/gomodifytags
$ go get -u -v golang.org/x/tools/cmd/gorename
$ go get -u -v sourcegraph.com/sqs/goreturns
$ go get -u -v golang.org/x/tools/cmd/goimports
$ go get -u -v github.com/cweill/gotests/...
$ go get -u -v golang.org/x/tools/cmd/guru
$ go get -u -v github.com/josharian/impl
$ go get -u -v github.com/haya14busa/goplay/cmd/goplay
$ go get -u -v github.com/uudashr/gopkgs/cmd/gopkgs
$ go get -u -v github.com/davidrjenni/reftools/cmd/fillstruct
$ go get -u -v github.com/alecthomas/gometalinter

その後、gometailinterで諸々のフォーマッタなどを一括インストールします。

$ gometalinter --install

これで、一先ずの準備は整いました。

ついでに、今後の学習でお手軽にGo言語の文法などを確認できるように、対話シェル(REPL)も導入しておこうと思います。 いくつか新しいものが出てきているようですが、私はgoreを使うことにしました。

$ go get -u github.com/motemen/gore

goreの使い方などは今後学習を進めながら都度紹介をしようかと思います。

これで自分で予定していた環境は最低限揃いましたので、ここはら一歩一歩Go言語の学習をしながら、社内ツールを作り込んでいきます。

ということで本日はここまで。