拓也Tweet2つの簡単なプログラムの作成を通じて、Go言語の特徴的な文法を学んでいく。(編注:2017年7月21日15時20分更新)記事公開当初の内容に誤植と技術的な誤りがありました、お詫びして訂正致します(解説を大幅に追加しました)。今回の修正と第3回以降の記事では外部監修者によるチェック体制を強化しております。Worldの実行までを行いました。今回はさらにGoの魅力を理解してもらえるように、簡単なプログラムを2つ作成し、それを通して型やインターフェースといったGoの文法を紹介していきたいと思います。以下ではLinuxもしくはMacで作業することを前提として書いていますが、WindowsでもコマンドプロンプトやPowerShellで同じようにできますので、ご安心ください。Webサーバを作ってみよう!まずはGoの威力を知るため、簡単なWebサーバを作ってみましょう。「server.go」というテキストファイルを任意の場所に作成し、以下のようにエディタで書いてみてください。build」コマンドを使ってバイナリを作ってみましょう。build」コマンドの実行後に、何も表示されなければ実行は成功です。build」コマンドを実行した環境に最適化されたバイナリファイルが生成されます。失敗した場合、例えば以下のようにエラーメッセージが表示されます。build」を実行してみましょう。ServeHTTP成功していれば、同じディレクトリに「server」という名前のバイナリファイルが作成されているはずです。それをターミナル上で実行してみます。Start!ここでブラウザから「http://localhost:8080」にアクセスしてみましょう。以下のように表示されていれば成功です。Goで作成したWebサーバが起動しているこのようにGoを使えば、わずか20行にも満たない行数でWebサーバを作って動かすことができます。「server」を停止する場合は、ターミナル上で「Ctrl」キーと「C」を同時に押して停止してください。プログラムの内容を理解しよう!それでは今作成したプログラムを解説していきます。mainこれは「server.go」ファイルが所属する「パッケージ」を宣言しています。Goでは、全てのプログラムは何かしらの「パッケージ」に所属している必要があります。Goのプログラムが起動した直後に「main」パッケージに属する「main関数」が実行されます(実際には、それより先に各パッケージの「init関数」が実行されます)。main.mainこのように、「mainパッケージ」や「main関数」がなければ、実行時にエラーとなってしまいます。そのため、必ず書くようにしましょう。"net/http")この部分では「server.go」が使用する他のパッケージを宣言しています。「mainパッケージ」の中に書かれていない関数を使う場合、その関数を持つパッケージ名を記載しなければなりません。今回は「fmtパッケージ」と「net/httpパッケージ」に含まれている関数を使っているため、この2つのパッケージを宣言する必要があります。w.Write([]byte(text))}ここでは「ServeHTTP関数」を定義し、その処理内容を記述しています。関数は基本的に以下の書式で書き表します。角カッコの部分は、必要ない場合は省略可能です。返り値2,...」を記述すること。}関数を使う場合、同じパッケージであれば「関数名([引数])」のように記述し、他のパッケージの場合は、「パッケージ名.関数名([引数])」と書きます。返り値は複数返すことが可能です。返り値の型2,...)」のように丸括弧で囲む必要があります。返り値は、引数と同じように識別子をつけることができます。その場合、以下のような書き方が可能となります。10と書いても問題ありません。}int型の返り値にあらかじめ「n」という識別子を付けておき、関数内で10を代入してreturnしています。n」と書く必要はありません。returnと書くだけでnを返してくれます。Goで頻出するイディオムとして、以下のように1つ目の返り値が関数の結果、2つ目の返り値はエラーが発生したかどうかを表す、というコードがよく登場します。_(アンダースコア)」を使用すると、変数を定義せずに返り値を無視することが可能です。以下のように書けば、関数の中でエラーが発生したかどうかだけを受け取れます。something()変数と型Goでは、変数を以下のように宣言します。「ServeHTTP関数」では以下のように1行目で「string型」の変数「text」を宣言し、2行目で文字列を代入しています。要素数で指定した数の要素を持つリストを実現する。実装すべきメソッドを定義した型(詳細は後述)。値が格納されているメモリへのアドレスを表すGoは型システムは非常に厳密であり、異なる型の変数同士の直接代入はできず、他の言語のように「暗黙の型変換」もありません。そのため、以下のような代入はエラーになります。エラーまた整数型の「int」は、インストールしたGoのbit数によって「32bit」か「64bit」のどちらかになります(32bit版のGoをインストールすれば「int32」と同じになります)。どちらであっても、「int32」や「int64」との互換性はありません。よって、以下の代入は失敗します。エラーもし異なる型の変数に値を入れたいのであれば、「キャスト(明示的な型変換)」が必要となります。成功、aに10が入るこのように厳密な型システムを持つことで、ビルド時にプログラムのミスをより多く見つけることが可能になります。Goの素晴らしいところは、型の恩恵を享受しつつプログラムの記述量を減らせる「型推論」の仕組みを持つところです。World"例えば上の2行の例は、以下のように1行で書くことができます。World"」という文字列で初期化しています。「=」が「:=」となっている点に注目してください。これは「新しく変数を定義する」という意味になります。World"という文字列を入れているので、このtextという変数はstring型だ」と判断し、プログラマが何も書かなくてもtext変数をstring型として扱ってくれます。よって、以下のコードはエラーと判定されます。エラーこの言語仕様のため、Goを使うプログラマが型に悩まされることはあまり多くありません。Goのコンパイラは、未使用の変数があった場合もエラーとしてくれるなど、コードの可読性に徹底的に気を配った仕様となっています。値型の変数に関しては、配列とすることができます。配列の書式は以下のようになります。初期化まで行う場合また、例えばint型配列の初期化を行う場合は,以下のように書きます。[3]int{1,2,3}要素数も「型」の一部であることに注意してください。そのため、「[3]int」と「[5]int」は全く別の型として扱われます。Goにおいては、配列よりもスライスがよく使われます。スライスであれば、配列のように要素数が固定されないためです。条件分岐Goではif文は以下のように書きます。処理内容}分岐条件を丸括弧で囲わないところが特徴的です。以下のように分岐条件の前に代入文を分けて書くこともできます。エラー処理}変数への代入と、それを使った判定を一度に書けるのは他の言語でもできますが、文の終端を意味するセミコロンを間に挟んで、2つの式をまとめて書くことができるというのはGoならではでしょう。同値判定をする場合は以下のような書き方をします。前述のとおり、Goのプログラムには必ず「main関数」が必要です。「server.go」の「main関数」は以下のようになっています。}}最初の「http.HandleFunc」は、「httpパッケージ」に属する「HandleFunc」を呼び出しています。「HandleFunc」の引数として、「"/"」と「ServeHTTP(関数)」を渡しています。これはブラウザから「Webサーバのドキュメントルート」にアクセスされた際に、自動的に「ServeHTTP」が呼び出されるように登録をしています。Start!」と表示するためのものです。最後の「http.ListenAndServe」は「ホスト名」「localhost」、「ポート番号」「8080」でブラウザからのアクセスを待ち受けるWebサーバを起動することを表しています。Webサーバとして起動するために必要なコードは、1行目と3行目の2行だけです。Goが簡単に高度なプログラムを書ける言語だということを理解してもらえたのではないでしょうか。インテリジェンス1984年生まれ、大阪出身。SIerにて衛星搭載系システムやスパコンのWebポータル開発に10年ほど関わった後、2016年7月より現職。ディレクター兼サーバサイドエンジニアとして、新規Webサービスの開発に従事。この著者の記事一覧@tenntennメルカリ・ソウゾウ所属。サーバサイドエンジニアとして日々Goを書いている。GoConference主催者。golang.tokyo、Goビギナーズ、GCPUG運営スタッフ。海外カンファレンスでも多数登壇経験あり。大学時代にGoに出会い、それ以来のめり込む。社内外で自ら勉強会を開催し、Goの普及に取り組んでいる。マスコットのGopherの絵を描くのも好き。第3回GoのWebアプリケーションフレームワーク2017/7/5連載3回目となる今回は、Go言語の代表的なWebアプリケーションフレームワークを紹介する。2回Goの基本的な文法を学ぼう2016/11/292つの簡単なプログラムの作成を通じて、Go言語の特徴的な文法を学んでいく。1回Go言語はじめの一歩2016/11/17さまざまな分野で事例が増えつつあるGo言語、まずは簡単なサンプルブログラムを書いてみる。ITでは、より付加価値の高いコンテンツを会員サービスとして提供しています。ITのWebサイトにログインすることでさまざまな限定特典を入手できるようになります。VeloCloudが選ばれる理由SD-WANとはなにか。Linuxエンジニア育成への思いF5とNGINXの組み合わせで、サービス公開をよりセキュアに。ITがお届けするポッドキャストです。