プログラミングを学ぼうと思った時、まずどの言語から学ぶべきなのか分からないですよね。そんな時は自分が作りたいものが何なのか、作りたいアプリケーションに適したものはどんな言語なのか、という視点から見ることで学ぶ言語の選択肢を絞ることができます!
今回はプログラミング言語の一つである、Go言語のメリットをご紹介します。この記事が、ご自分が作りたいアプリケーションに適しているのかの判断材料になればと思います。
なお、次の記事ではそもそもGoとはどんなプログラミング言語なのか、その特徴をできることや将来性も交え詳しく解説しているので良ければ参考にしてください。
→ Go言語とは?特徴やできること、学習方法をわかりやすく解説
Go言語を学ぶ4つのメリットとは?
年収が高い
求人検索エンジン「スタンバイ」によると、Go言語を使うエンジニアの年収の中央値は600万円とされており、Scalaと並んで一番高い年収となっています(2018年時点)。人気の高いプログラミング言語Python、Rubyを上回っているというのは驚きですよね。
また、最大提示年収の面からみるとScalaを超えて1位となっています。この背景として、企業側のニーズに対してGo言語エンジニアが不足しているということが考えられます。
Go言語でアプリケーションを開発していて、なおかつGoエンジニアが不足している企業が平均年収を上げている、と予想できるのではないでしょうか。
まだまだ新しい言語である
Go言語は他の開発言語と比較すると新しい言語です。Go言語が登場したのは2009年ごろで、現時点では10年弱の歴史しかありません。
例えば有名な開発言語のJavaであれば1995年ごろから登場しているので、20年以上の歴史があるということになります。
C言語は1972年ごろに登場しているので45年以上の歴史があり、Pythonは1991年ごろの登場なので25年以上の歴史があります。
また、先程の平均年収の中央値でGo言語とともにトップとなったScalaですら2003年ごろに登場しており、15年以上の歴史があることとなります。その中で10年ちょっとの歴史しかないGo言語はまだまだ新しい言語であると言えますが、それでもGoエンジニアの年収は高いので期待値が高い言語であると考えられるでしょう。
シンプルかつ洗練されている
Goは表現力豊かで,すっきりして簡潔,なおかつ効率的な言語です。
公式で上記のように説明されている通り、Go言語はコードをシンプルに書くことができます。変数や定数をまとめて宣言することも可能ですし、無名関数ももちろん使用できます。
無名関数とは、宣言をせずに使用できる関数です。変数・構造体(データの塊のようなもの)などに代入したり、戻り値として返すことができます。
エラーハンドリング(エラーが起きた時の処理を記述しておくこと)などは、下記のように簡潔に記述できることがほとんどです。
if err != nil { fmt.Println("エラーが起きました") }
ここではエラーが無いことを確認するためにnilと比較をしています。nilというのは0ですらない、何も参照できない状態を示します。
他の言語ではNull(ヌル)と言われることも多いですが、意味としてはNullもNilも同じです。上記のようなNilとの比較だけで記述できるエラーハンドリングと比較するために、Javaの例外処理も見てみましょう。
try { doSomething() } catch(IOExeption e) { System.out.println(IOExceptionが発生しました"); } finally { System.out.println("例外処理を終了します"); }
まずtry部分で実際に処理を行います。その処理の中で例外が発生した場合は、次のcatch()という部分に入ります。例外が発生したかどうかにかかわらず、最後にfinallyの処理を実行して例外処理は終了です。
ちょっとサンプルで書いただけでも行数が多いということが分かります。例外というのは「予期しないエラー」を指しますが、Javaではこの例外の種類を開発者が理解していないといけません。
上記ではサンプルとしてIOExeptionをキャッチしましたが、例外の種類は他にもたくさんあります。例えばEOFExceptionや、NullPointerExceptionなど・・・どの例外がどんな内容だったか?どんな処理の時にどんな例外が起きるのか?など、全てを把握するのは大変です。
もちろんExecptionという例外もありますのでそれを使って例外を丸める(まとめる)ことも可能ですが、注意しておかないといざアプリケーションが落ちたときにどこでエラーが発生したのかが分かりづらくなってしまいます。
そういった意味では、Go言語はシンプルであり、開発しやすい言語だと言えるでしょう。
楽しみ方が豊富である
まず、Go言語はMacでもWindowsでもLinuxでも開発ができるため、環境に縛られることがありません。そして、実際にGo言語で作れるものも様々です。
一例ですが、下記のようなものがGo言語で開発できます。
- API
- GUI
- CLI
API(Application programming interface)というのは、クライアントから送られた通信に対して何かしらのデータやメッセージを返すものです。画面とデータベースや、また別のAPIとの受け渡し口となります。
APIの処理は、役所の窓口業務のようなイメージです。役所に行って住民票をもらうために窓口に行きますよね。その窓口の担当者が、別の作業者に住民票を発行する手続きを依頼します。作業者が印刷した住民票を窓口の担当者が受け取り、それを最後にあなたに渡します。
ざっくりと説明してしまうと、APIが行っているのは上記のような処理です。本人確認書類を見せたりしますが、「ログインの資格がありますか?ご本人様ですか?」という確認を窓口の人がするように、APIも必要に応じて認証を行ったりします。
次は、GUIについてご説明します。Goには色々なパッケージ(ツールのようなものです)が用意されており、そのパッケージを使うことでGUIアプリケーションをつくることもできます。
GUI(Graphical user interface)とは、普段私たちが操作しているような画面上のアプリケーションのことを差します。
最後に、CLIについても解説します。CLI(Command-line interface)とはよく「黒い画面」といわれるもので、コマンドのみでコンピュータを動かす方法です。GUIでフォルダを移動する際にはダブルクリックと戻るボタンで移動しますが、CLIでフォルダを移動したい時は「cd」というコマンドを使うことで別のフォルダに移動できます。
(コマンドはお使いのOSやシェルによって異なります)
Go言語を学ぶデメリット
主要言語と比較して求人数が少ない
Goエンジニアになると年収も比較的高いし魅力的に感じますよね。とはいえ、デメリットが全く無いわけではありません。
一度デメリットについてもご紹介させていただきます。上記のグラフは、Go言語の求人数を表しています。
他の言語に比べてGo言語の求人数自体が少ないということが一目で分かります。JavaやPHPというメジャーな言語に比べると、まだまだ求人数が少ないのが現実です。
そもそもGo言語を扱えるエンジニアが少ないので、プロジェクトでもGo言語の採用が難しく、さらに採用に歯止めがかかってしまっている可能性があります。
他の言語仕様と異なる部分も多い
今まで他の言語に触れたことが無い人は混乱を避けられるかもしれませんが、逆に今まで他の言語(特にC言語やJavaなどの静的型付け言語)に触れていた人はGo言語を始めると戸惑ってしまうかもしれません。
まず1つ目に、Go言語には三項演算子がありません。三項演算子というのはif文を1行で表す構文で、条件分岐内の処理がシンプルであれば可読性を上げることができます。
可読性とはソースコードが人にとってどれだけ読みやすいか?ということです。自分以外のプログラマーがソースコードを見たときに内容が理解しやすければ「可読性が高い」ということになります。
例え1行に圧縮できたとしても、他の人が見たときに理解しづらいコードは「可読性が低い」ということになってしまいます。
実際に三項演算子の構文を簡単にご紹介します。JavaScriptの場合は、下記のように三項演算子を表します。
hogehoge ? "ok" : "ng";
これは、hogehogeという変数の中にtrueが入っていたら”ok”という文字列を返すコードです。逆に、三項演算子を使わない場合は下記のように表します。
if hogehoge { return "ok" } else { return "ng" }
明らかに行数が増えていることが分かりますね。最初のうちは三項演算子を使わない方が分かりやすく感じるかもしれませんが、コード全体をすっきりさせるためには三項演算子が便利です。
ところが、Go言語では三項演算子をサポートしていない為使うことができません。他の言語で三項演算子をよく使っていた人からしたら、がっかりしてしまう情報かもしれないですね。
Go言語と他の言語の2つ目の違いは、「継承」という概念が無いことです。Go言語には継承という概念が無く、あるのは「委譲」という概念だけです。
これはよく「継承より委譲」と言われます。そもそも継承がどんなものなのかというのを先にご説明したいと思います。
継承というのは、親クラスの機能を子クラスが引き継ぐことを言います。例えば魚という親クラスを継承した金魚という子クラスがあった場合、子クラスは親クラスの持つ「泳ぐ」というスキルを使うことができます。
では委譲は何かというと、ざっくりとした説明になりますが、継承と違って「親クラスの情報を持っているだけ」になります。渡された親クラスの情報(泳ぐ、というったスキルなど)を使うことはできますが、必要な場所でだけ呼び出すことができます。
継承はクラスに対してextendsと記述し、特定のクラスに親情報を引き継がせます。委譲はその必要が無いため、必要な時、必要な場所でだけ使用できます。
最後に、この章に出てきた専門用語を簡単に整理しておきます。
三項演算子・・・if文の省略系。行数を省略することができるが、可読性が下がるリスクもあります。
クラス・・・ソースコードの塊のようなもの。Go言語にはクラスという概念はありませんが、Java等には存在します。
委譲・・・処理をする為の情報などを渡すこと。例えばデータベースへの接続情報など。
静的型付け言語・・・静的型付け言語とは、変数の宣言を行う時に変数に入れられる値のタイプをあらかじめ決めておく必要がある開発言語のことをいいます。関数やメソッドの戻り値のタイプも、あらかじめ宣言しておかなければいけません。
Go言語の将来性は?
「Go言語を学ぶメリットとは?」でも解説しましたが、Go言語は登場してからまだ10年ちょっとの歴史しかありません。CやJAVA、PHPに比べるとまだまだ新しい言語です。
新しいということは、これからもっと便利になる可能性がある言語だということでもあります。求人数自体はまだ少ないのがネックですが、メルカリやDockerがGo言語を採用していることを考えると、大きなプロジェクトで今後採用されていくことも有り得るでしょう。
例外処理が無いなどほかの言語仕様をカバーできない箇所も残念ながらありますが、静的型付け言語を学んでおけば他の言語を学習する時の助けにもなるでしょう。つまり、Go言語は勉強しておいて損はしない言語だと言えますね。
まとめ
今回はGo言語のメリットとデメリット、将来性について解説させていただきました。Go言語を取り巻く状況としては、年収が高い代わりに求人数自体はまだ少ない、ということがお分かりいただけたと思います。
そして、歴史が浅い言語ですのでまだまだ将来性もあるという点も、ご理解いただけたのではないでしょうか。もしGo言語に興味が出てきたら、一度ちょっとしたアプリやCLIツールを作ってみてくださいね!