Pocket

こんにちは。
最近みんなから女々しいって言われてるロンテックの深澤です。

goを勉強しているのですが素敵なところがいっぱいあるので、みんなに伝えたいなと思ってこの記事を書きました。
goかわいい。

あんまり僕も言語の経験が豊富なわけではないので、もしかしたら間違いもあるかもしれませんが、温かく見守ってくれたらと思います。

(1)コーディング規約について
普通、どの言語にもコーディング規約が存在し、
それは開発者がそれぞれ気をつけるべきものでしたが、
go言語では、次のようにコマンド一発で修正しちゃいます。

(2)クロスコンパイル
僕にとってコンパイル言語(CとかC++とか)の常識では、
実行環境に応じて、コンパイルするマシンを変更しなければならないという認識でしいたが、goは違います。

先ほどのhelloworldコードをOS X上で開発し、それをlinux上にて実行してみます。
次のコマンドで64bitのlinuxで実行されるプログラムが完成します。

これを適当にscpコマンドかなんかでubuntu14.04 64bitに送ってやる。

実行してみる。

すげぇ。

(3)ローカルを汚さずにリモートのモジュールを参照できちゃう
rubyのbundleとか scalaのsbtとかもそうですけどローカルに余計なファイルを作ってしまう印象がありますが、
今のところ goくんにはそういったところは感じられません(後からしれっと修正するかも笑)。
importでリモートを参照して、バイナリファイルを作れちゃいます。
例えば、以下みたいなファイルがあったとして、上側のgoexample.goは、
僕のgithub上に上がっていると仮定します。

・goexample.go

・main.go

mainの方でリモート上にあるgoexample.goファイルを参照して、hello rontechを出力することができます。

(4)余計なインポートファイルが増えない
goくんは変なインポートファイル(使っていないインポートファイル)があるとエラーを吐きます。

こんな感じのコードがあったとします。

fmtパッケージとlogパッケージをインポートしていますが、
logパッケージはプログラム内で使用していません。

このコードを実行すると次のように表示されます。

これはjavaとかには存在しません。
素晴らしいですね!!

(5)独自の型定義について

例えば、こんなコードがあったとしましょう。

関数ProcessTaskでは、idとtaskIdを受け取り、それを出力しますが、
結果は次のようになります。

mainで定義されている値(渡したい値)と逆になってしまいました。
よく見ると一目瞭然ですが、main関数の中でProcessに値を渡している時、
値が逆になってしまっています。
けど、どっちも同じint型だからコンパイル時に発見できなかったんですね。

まぁ、プログラミングあるあるですね。

goくんではこんなあるあるを予防するため型を独自に定義できます!
型をそれぞれに定義することで予期せぬ動作をコンパイル時に発見することが可能です!
かわいい!!

こうやってオリジナルの型である、ID型とTaskID型を定義すれば、
上記プログラムをコンパイルした際にエラーを発見できます。

くぅーーー!!!!!!!

(6)コーディング環境について

最近のプログラミングでは、前よりもdependenceが増えてきた上、オブジェクト指向という大きな流行があります。
そのため、どのような開発環境にすべきか予め設計するという考え方がとても重要になってきた気がします。
goだって例外ではありません。
今後のことを考え、よりオブジェクトに、スケール可能な開発環境を整えるべき・・・と僕は考えています。

その上で必ずぶつかる壁がGOPATHです。
GOPATHとは、基本的にRubyでいうところのgemみたいなやつで、外部のモジュールを保存するPATHですが、
Goでは、外部からのモジュールと開発プロジェクトは同一ディレクトリで開発・管理することが推奨されています。
また個人的には自分のパッケージ等を公開することを考えて予めgithubのパスを含めた場所で開発を行うのが良いと思います。

詰まるところ、こんな感じです。

go/binは、環境変数に加えておくことを個人的に推奨します。
go install というコマンドがあり、このコマンドを使うと、自分の書いたgoプログラムをインストールできるのですが、
そのインストール先が $GOPATH/bin となります。
そのため、ここを環境変数として設定しておけば、インストール後、即実行可能という無双サイクルが出来上がります。

ちなみに依存関係は全てソースコードなので、
アンインストールしたい場合は、手動で依存してるソースコードを削除すればオッケーです(コマンドとかあれば便利なのに・・・)。
その際に依存したオブジェクトファイルなどは $GOPATH/pkg内にぶち込まれてます。

それと、なぜソースコードなどが入るsrc配下にgithub.comディレクトリや、自分のgithubユーザ名ディレクトリを作成するかというと、
go getコマンドという外部からgoのモジュールを持ってくるコマンドが存在して、
その際に通信はL7のhttpとなり、srcディレクトリ配下にgo get で指定したパスがそのままディレクトリとして構成されるからです。
そう、つまり「常に自分のコードを公開できる前提でコードを書く」ということを考えた時にこのディレクトリ構成がいいんです。

まぁ、説明が非常に難しいのですが、例えば、goプロジェクト($GOPATH)のディレクトリは最初こんな感じですね。

僕のgithubにこんなgoプログラムがあります(hello worldを表示するだけです)。
https://github.com/pukka/my-first-go

httpによる通信なのでこんな感じで持ってきます。

すると、先ほどのディレクトリ構成はこんな感じに変身します。

そうです、githubから降ろしてきたコードがURL通りのディレクトリ構成となってるんです。
だから、自分で新しいプロジェクトを作成する際にも公開することを意識してこのようなディレクトリ構成で作べきですね(上の例であれば、自分はpukkaディレクトリ配下にガンガンgoコードを書いていきます)!

こうすることで、例えば大きなgoプロジェクトを作成した際にパッケージ同士を参照しあったりしてる時、
このような構成になっていれば、リモートからgo getで容易に同一環境を生成できますね。

なお、go get はgit cloneと違い、goプログラムをインストールするということに注意が必要です。
go/bin配下にインストールファイルが生成されています。

とりあえず、今回はgoの良いところと推奨環境までにしときます。
やっぱりgoかわいい・・・かわいいよ・・・。

4 thoughts on “貴女に・君に今goを伝えたい1

  1. Lambert Zhang

    連載の続きをお待ちしております!

    1. はい、頑張ります!

  2. 同じく更新を期待しております

    1. ありがとうございますー!
      go言語、楽しいですよっ!笑

Share Your Thought