「Golangで!」
のひと言がきっかけで、Go言語を学んでみようということになりました。
ゼロからプログラミングを学ぶ記事は世の中にいっぱいあるけれど、そういえばエンジニアが新しい言語を学ぶ記事ってあんまりないなとも思い、せっかくだからついでに記事にもしようと。
それに、いまのアットファイブはなぜか書いたもん勝ちみたいなノリが横行しているのです。乗らない訳にはいかないのです。
それではまずは私自身の技術者としての経歴とスキルを、、とかやっている時間はありません。Go言語学習1日目で学んだこと、やったことを一気に書いてゆきます。
環境構築
Go言語については「コンパイルするから速い」「型がカッチリしてる」くらいの知識しかないけれど、とりあえず環境を作ることにします。
最近の言語はLinux、Windows、Macならたいていカバーしてくれています。
最終的にはLinuxサーバで動かすのが一番良いのでしょうが、一番馴染んでいるWindowsでまずは試してみることにします。これは「新しい言語を味見してみる」という1点に集中し、他の余計なところに時間を取られないためです。
「Go言語 インストール」などで検索すると環境構築の記事は幾らでも出てくるので、それを参考に本家からWindows版をダウンロードしインストールします。
で、そのまま実行します。漢は黙って全デフォルトインストールです。問題は起きてから考えればよいのです。
最近のインストーラは良く出来ているので、もういきなり使える状態になっています。コマンドプロンプトでgo versionが動くことを確認したら、ついでにHello Worldくらいまでサラッと試してみます。
写経
と、このあたりまでは個性の出しようもないので、エンジニアの皆さん誰もが同じような流れで作業するかと思います。で、ここから人によって学び方・進め方のいろんなバリエーションが出てくるのかなと。
私が次にやったことは「写経」です。
手ごろな短いサンプルプログラムを、意味はわからなくてもいいからとにかく手で(コピペではなく!)書き写してみます。
写経のお手本とさせていただいたのはこちらの「素数探索アルゴリズム(その1)」でした。
わずか30行弱の小さなプログラムなのですが、書き写すことによっていろいろなことがわかります。
・package, import, main。はいはい、お馴染みですね。
・「;」(セミコロン)がない系ですか。pythonでちょっと慣れはしたけれど。
・「:=」が定義して代入って感じ?
・メソッド名がなんで大文字始まり?システムライブラリってこと?区別する意味ある??
・for文に括弧がない。けど、セミコロンは付くんだ、、
・C言語っぽいprint文。sprintfとかsscanfとかあったよね、、
いろいろ違和感や疑問はありますが、そのまま進みましょう。
まずはコンパイルしてみます。下の画像は再現用なので綺麗にいってますが、最初は幾つかコンパイルエラーが出ました。UTF-8じゃないとダメよとか。
私は秀丸エディタを使っているのですが、ファイルを新規作成したときのデフォルトがShift-JISのままなのですよね。変えよう変えようと思っていたのですがやはりこういう地味な弊害が出ます。
プログラム自体は2重ループでカウンタアップして、割り切れる数を除いて素数を取り出してゆくというシンプルなもの。
なので「おー、動いたー」という感動よりも「こんなに簡単にWindowsのexeが出来たー」という感動の方が大きかったです。MFCとか悪夢みたいでしたよね、、
文法に戻ろう
なんとなく手触りがわかったので、さっきコードを書いていて気になった点など細かいことが今度は知りたくなります。
という訳で適度に文法がまとまったページを探しました。googleで検索して、見出しをみて気になったページをとりあえず新規タブでどんどん開きます。
で、今度は各タブをスクロールバーを使って上から下まガーッと眺めて、良さげだったら残し、イマイチだったらその場でタブを閉じてを繰り返します。考えちゃダメです。フィーリングでいきましょう。
で、私的にはなんとなくこのあたりとか、こことかが気になったので、今度はもう少し時間を掛けて読んでゆきます。
importと型宣言に関する細かい話とか、メソッド名の大文字小文字はスコープを表すなど、さっきのコードの疑問がある程度解消されます。
それと同時に新しいキーワードや疑問もどんどん出てきます。
・ポインタあるんだ。もう何年使ってないだろう。
・スライサーって何だろう?配列をなんかするヤツがいるのか。
・戻り値を2つで受けるのはpythonでもあったなー。
・チャネルって?イベントとかメッセージ系のナニカ?
・オブジェクト指向でないといいつつ、Interfaceってそれっぽいよね。
とかとか。まあ後でゆっくり学べばいいのでそのまま次に行きます。
次はやっぱりWebでしょう
apache、tomcatを使わずにWebサービスが作れるというのはGo言語の本当にすごいところだと思います。
あのバージョンが上がるごとに書き方の変わる、自分が変更する以外にも膨大な記述があって何かあったときに対応できない不安感を煽りまくるhttpd.conf(とその仲間たち)とスッパリ縁を切ることができるのです。
まずはやってみよう!とこのページを参考に再び写経タイム。
またもや30行程度。これでローカルホストにポート9090で待受けるWebサーバが立ってしまうのです。すごい。
しかも厳密に言うと本体は24-25行目の2行だけです。
コンパイルし、できたexeを実行し、ブラウザで「http://localhost:9090」にアクセスしてみる。
とても、いやかなり凄く寂しい画面ですが、確かにさっき書いたプログラムが動いています。
ただのexeをコマンドプロンプトから実行するだけで、webサーバが立ちあがっているのです。しかも相手はあのWindowsです。すごい。
URLのパスを変えたり、getパラメタを付けたりしてアクセスすると勝手にparseしてくれます。真っ白な画面のURL欄で文字を入れてエンターキーを押すと、隣の黒い画面に文字が出るだけがそんなに楽しいかって?めちゃくちゃ楽しいじゃないですか!
で、一通り楽しんだ後は、またおさらいがしたくなります。
Go言語のhttpパッケージの中の解説をしているページがありました。
とてもシンプルなコードですね。C言語でデーモン(サーバ)プログラムを作ったときは「socket作ってbindしてlistenして」と全部自前でやっていました。でも、そのおかげでパッケージの中で何をやってくれているかよくわかります。技術は日々進歩しているけれど、昔学んだことも決して無駄ではないと感じる瞬間です。
また、下の方の全体フロー図。中国語は読めませんが、Goの強力な特徴のひとつと噂される並列処理がgo c.serve()で行われているんだろうなというのがわかります。
並列処理と、あとWebのフレームワークあたりも気になってきますが、本日はいったんここまで。走り始めてしまったら、あとはもう勢いですね。どんどんやっていきましょう。READY STEADY GO!(歌替わってる。てか、タイトルこっちと迷いました。。)