新しいプログラミング言語を学ぶ最初の一歩は、まずツールと環境を設定してから、シンプルな「Hello, world」アプリケーションを実行するのが伝統的です。けれどもGo Playgroundを使えば、この昔ながらの手続きが、1回のクリックに短縮されます。
面倒な手順を省略して、シンプルなプログラムを書いて変更するのに必要となる構文とコンセプトの勉強を開始することができるのです。
今回は以下のことを学びます。
- Goの特徴。
- Go Playgroundのアクセス方法。
- 画面にテキストを表示する。
- どこの言葉のテキストでも実験に使えるようにする。
Goは、現代的なクラウドコンピューティングのプログラミング言語です。重要なプロジェクトのためにGoを採用している会社には、Amazon、Apple、Canonical、Chevron、Disney、Facebook、General Electric、Google、Heroku、Microsoft、Twitch、Verizon、Walmartなどがあります(詳細は、https://thenewstack.io/who-is-the-go-developer/や、https://github.com/golang/go/wiki/GoUsersを参照)。Webの根底にあるインフラストラクチャの大きな部分がGoへとシフトされていて、その動きを駆動しているのは、CloudFlare、Cockroach Labs、DigitalOcean、Docker、InfluxData、Iron.io、Let’s Encrypt、Light Code Labs、Red Hat CoreOS、SendGridなどの企業や、Cloud Native Computing Foundationのような組織です。
Goはデータセンターで活躍しているだけでなく、その他の職場にも採用されています。RonEvans とAdrian Zankich が作ったGobotは、ロボットやハードウェアを制御するライブラリです。Alan Shreveの開発ツール、ngrokは、Goを学習するプロジェクトとして作られましたが、いまではフルタイムのビジネスツールになっています。
Goを採用する人々は、自分たちをgopher(ゴーファー)と呼んでいます。これは図1-1に示すGoの陽気なマスコットにちなんだ名前です。プログラミングは簡単な仕事ではありませんが、Goと本書を味方にして、あなたがコーディングの楽しさを発見できることを願っています。
このレッスンでは、あなたのWebブラウザのなかでGoプログラミングの実験をします。
Column こう考えてみましょう
ディジタルアシスタントに対して「クルマを呼んで」と声をかけたら、タクシー会社に電話をかけてくれるでしょうか。それとも「クルマ」という名前の人を呼び出すでしょうか。英語や日本語のような言語は、曖昧さ(多義性)に満ちています。
明晰性は、プログラミング言語で最も重要なものです。もし言語の文法や構文が曖昧さを許したら、コンピュータは、あなたが言うことを、聞いてくれないかもしれません。いったい何のためにプログラムを書くのか、わからなくなってしまいます。
Goは完璧な言語ではありませんが、これまで私たちが使ってきた言語よりも優れた明瞭性を追求しています。このレッスンを読み進める上で、見慣れない略語や、意味のわからない用語などにぶつかるかもしれません。すべてが最初から明瞭ではないでしょう。それでも時間をかけて、Goがどのようにして曖昧さを少なくするのかを理解してください。
1.1 Goとは何でしょう?
Goはコンパイルされるプログラミング言語です。プログラムを実行する前に、Goはあなたのコードを、コンパイラで、機械が理解できる1と0に翻訳します。あなたのコードは、実行あるいは配布が可能な1個の「実行ファイル」へとコンパイルされます。そのプロセスで、Goコンパイラは、タイプミスやその他の間違いを見つけ出します。
このアプローチを採用しないプログラミング言語もあります。Python、Ruby、その他、人気のある言語のいくつかは、インタープリタを使って、プログラムを実行時に、ステートメント(文)ごとに翻訳します。したがって、まだテストしていない実行経路にバグが潜んでいる可能性があります。
その一方で、インタープリタを使うとコードを書くプロセスが高速化され、対話的になります。おかげで、動的で気軽な楽しい言語という評判になります。逆にコンパイルされる言語は静的で、型にはまった、融通の利かない、プログラマに妥協を強いるものだという悪評が立ち、コンパイラは遅いとひやかされます。けれども、本当にそうなのでしょうか。
私たちは、C++やJavaのように静的にコンパイルされる言語の安全性と性能を持ち、しかも、Pythonのような動的な型を持つインタープリタの軽さと楽しさがあるような言語を求めたのです。
- Rob Pike, Geek of the Week
Goは、ソフトウェアを書く「経験」を深く考慮して作られています。大きなプログラムでも1個のコマンドで、数秒のうちにコンパイルされます。この言語は多義性を招きかねない機能を排除し、予測しやすく容易に理解できるコードを推進します。そしてGoはJavaなどの古典的な言語で要求されがちな固定的な構造に対して、もっと軽量な代替策を提供します。
Java は、C++にある多くの、めったに使われず、理解が不十分で混乱を招く機構を略しました。それらは、私たちの経験によれば、利益よりも嘆きを多くもたらすからです。 - James Gosling, Java: an Overview
新しい言語は、どれも過去のアイデアを改良するものです。Goでは、それまでの言語よりも、メモリを効率良く使うことが容易で、しかもエラーを起こしにくくなっていますし、マルチコアのマシンで、すべてのコアを活用するように作られています。Goへの切り替えの成功例では、しばしば効率の良さが引き合いに出されます。Iron.ioは、Rubyを実行する30台のサーバーを、Goを使う2台のサーバーで置き換えることができました。
Bitlyでは、PythonのアプリケーションをGoで書き直して「着実な、計測可能な性能の向上」を得ることができ、その後、Cで書かれたアプリケーションをGoで引き継ぐことになりました。
Goは、インタープリタ言語が持つ楽しさと容易さを、効率と信頼性を向上させつつ提供します。Goは小さな言語で、ごくわずかなコンセプトしか持たないので、学習が比較的高速になります。Goのモットーは、次のように、3つの教義で構成されます。
Goはオープンソースのプログラミング言語で、単純で効果的で信頼できる大規模ソフトウェアの生産を可能にします。 - Go Brand Book1
Tips
Goに関連するトピックをインターネットで検索するときは、「Go language」を略した「golang」というキーワードが有効です。この「-lang」という後置詞は、Ruby、Rustなど、他のプログラミング言語にも使えます。
◆クイックチェック1-1
Goコンパイラの利点は?(2つ挙げて下さい)。
1.2 Go Playground
最も素早くGoを使い始める方法は、Go Playgroundを訪れることです(図1-2)。ここなら何もインストールすることなくGoプログラムを編集し、実行して、実験することができます。[Run]ボタンをクリックすると、PlaygroundがGoogleサーバー上で、あなたのコードをコンパイルして実行し、その結果を表示します。
[Share]ボタンをクリックすると、あなたが書いたコードを再訪するためのリンクを受け取ることができます。このリンクを、友達とシェアしたり、ブックマークして作業を保存したりできるのです。
Note
本書のコードリストや練習問題は、どれもGo Playgroundが使えます。また、テキストエディタとコマンドラインに慣れている人は、Goをhttps://golang.org/dl/からダウンロードして、あなたのコンピュータにインストールすることもできます。
◆クイックチェック1-2
Go Playgroundの[Run]ボタンは、何をするのでしょう?
1.3 パッケージと関数
Go Playgroundにアクセスすると、リスト1-1が表示されます。最初の一歩に適したプログラムと言えるでしょう。
package main // このコードが属するパッケージを宣言する import ( "fmt" // fmt(format)パッケージを使えるようにする ) func main() { // main という名前の関数を宣言する fmt.Println("Hello, playground") // Hello, playgroundと画面に表示する }
この短いリストで、package、import、funcという3つのキーワードを導入しました。これらのキーワードは、どれも特別な目的のために予約されています。
packageキーワードは、このコードが属するパッケージを宣言します。この場合、それはmainという名前のパッケージです。Goでは、すべてのコードを「パッケージ」に入れて組織します。Goの標準ライブラリは、算術用のmath、圧縮用のcompress、暗号用のcrypto、画像処理用のimageどのパッケージで構成されています。それぞれのパッケージが、1個のアイデアに対応するのです。
その次の行は、importキーワードを使って、このコードが使うパッケージを指定します。パッケージには、いくつでも関数を入れることができます。たとえばmathパッケージは、Sin、Cos、Tan、Sqrtのような関数を提供します。ここで使っているfmtは、「フォーマット」(整形)される入出力の関数を提供します。テキストを画面に表示する処理は頻繁に行われるので、formatを略したfmtをパッケージ名にしています。
funcキーワードは、関数を宣言します。この場合は、mainという名前の関数です。関数の本体は、どれも1対の波カッコ({と})で囲みます。これによってGoは、それぞれの関数が、どこで始まり、どこで終わるのかを把握します。
mainというのは、特別な識別子です。Goで書かれたプログラムを実行するときは、mainパッケージのmain関数から実行が始まるのです。もしmainがなければ、どこからプログラムを実行すればいいのかわからないので、Goコンパイラはエラーを報告します。
テキストの行を表示するのに、Println関数を使います(lnというのはlineの略です)。Printlnの前に、1個のドット(.)を挟んでfmtを置いてます。このように前置するのは、Println関数がfmtパッケージによって提供されているからです。インポートしたパッケージから関数を使うときは、いつも、その関数名の前に、パッケージ名とドットを置きます。Goで書かれたコードを読むときは、それぞれの関数がどのパッケージから来たのか、一目瞭然です。
このプログラムをGo Playgroundで実行すると、「Hello, playground」というテキストが表示されます。2重引用符で囲まれたテキストは、画面にそのまま反映されます。英語ではカンマを書き忘れると文章の意味が変わったりしますが、プログラミング言語でも、句読点が重要です。あなたが書いたコードをGoに理解させるには、引用符や丸カッコや波カッコが頼りなのです。
◆クイックチェック1-3
1 Goのプログラムは、どこから始まりますか?
2 fmtパッケージは、何を提供しますか?
1.4 波カッコの、たったひとつの正しい使い方
Goは、波カッコ({と})の置き方について厳密です。リスト1-1では、開き波カッコ({)が、func キーワードと同じ行に置かれ、閉じ波カッコ(})は、独自の行に置かれています。これが「たったひとつの波カッコの置き方」で、他の方法は使えません。詳しくは、https://en.wikipedia.org/wiki/Indentation_style#Variant:_1TBS_(OTBS)を見て下さい。
Goが、どうしてこれほど厳密になったかを理解するには、Goの誕生まで遡る必要があります。当時のコードはセミコロンに満ちていました。どこにもセミコロンがあって、逃れる方法がなかったのです。どの文にも必ずセミコロンを1個、最後に必ず付ける約束でした。たとえば、次のように。
fmt.Println("Hello, fire hydrant");
2009年の12月に、一群のninja gopherたちが、この言語からセミコロンを追放しました。いえ正確には、そうではなく、Goコンパイラが、あなたに代わってセミコロンを挿入するようにしたのです。それで完璧に動作しました。その完璧さの代償として、あなたは波カッコの「たったひとつの正しい使い方」に従う必要があります。
もし開き波カッコを、funcキーワードとは別の行に置いたら、Goコンパイラは次のように構文エラーを報告するでしょう。
func main() // missing function body(関数本体が欠けています) { // syntax error: unexpected semicolon or newline before { // 構文エラー: 予期しないセミコロンまたは改行が{の前にあります }
コンパイラは、別に怒っているわけではありません。セミコロンが間違った場所に挿入されたので、ちょっと困惑しているだけです。
Tips
この本を読み進みながら、コードリストを自分で打ち込むと良いでしょう。タイプミスをしたら構文エラーが出るでしょうが、それでいいのです。エラーを読み、理解し、修正するのは重要なスキルです。粘り強さは、有益な資質です。
◆クイックチェック1-4
構文エラーを防ぐには、開き波カッコ({)を、どこに置けば良いですか?
1.5 まとめ
- Go Playgroundなら、何もインストールせずに、Goを使える。
- Goプログラムは、どれもパッケージに含まれた関数で構成される。
- テキストを画面に表示するには、標準ライブラリで提供されるfmtパッケージを使う。
- 句読点は、普通の言語でもプログラミング言語でも重要。
- Goのキーワードは25個。そのうち、package、import、funcの3つを使った。
理解できたかどうか、確認しましょう。
これから先の練習問題では、Go Playgroundのコードを書き換えてから、[Run]ボタンをクリックして結果を見ます。もし行き詰まったら、Webブラウサをリフレッシュすれば、元のコードに戻せます。
練習問題(playground.go)
- 画面に表示するテキストを変更します。それには、引用符で囲んだ部分を書き換えます。コンピュータが、あなたの名前を出して挨拶するようにしましょう。(たとえば「Hello, 太郎さん」とか)
-
2行のテキストを表示するように、main関数の、{と}で囲まれた本体のなかに、以下の ような第2のコード行を追加しましょう。
fmt.Println("Hello, world") fmt.Println("Hello, 世界")
- Goは、何語の文字でもサポートします。中国語、日本語、ロシア語、スペイン語などで、テキストを表示させましょう。知らない言語でも、Google Translateを使って翻訳したテキストを、Go Playgroundにコピー&ペーストすればOKです。
[Share]ボタンを使えば、あなたのプログラムへのリンクを取得できます。原著『Get Programming with Go』のフォーラムにポストすることで、他の読者とシェアできます。
本書の付録にあるコードリストと、あなたのソリューションを比較してみましょう。
1.6 クイックチェックの解答
◆クイックチェック1-1
大きなプログラムを数秒でコンパイルできること。実行する前にタイプミスなどの間違いを検出できること。
◆クイックチェック1-2
[Run]ボタンは、Googleサーバー上で、あなたのコードをコンパイルしてから実行します。
◆クイックチェック1-3
1 プログラムは、mainパッケージのmain関数から始まります。
2 fmtパッケージは、整形される入出力の関数を提供します。
◆クイックチェック1-4
開き波カッコは、funcと同じ行に置く必要があります。別の行に置いてはいけません。これが波カッコの、たったひとつの正しいスタイルです。