Go言語の特徴を徹底解説!Go言語でできることやC言語との違いは?
トレンドが変わるIT業界
IT業界では、常にトレンドが短いスパンで入れ替わります。
最新の技術やライブラリ、構成など、IT業界の中の全ての分野に見られる傾向です。
プログラミング言語も同様で、様々な言語が台頭してきます。
今回の記事で注目するのは、プログラミング言語別年収ランキング2018で第1位に輝いた「Go言語」です。
大注目の言語として脚光を浴びつつある言語ですが、一体どのような特徴があり、なにが実現できるプログラミング言語なのでしょうか。
特徴やできることに加えて、他の言語との違いや基本的なコード、メリットなどにも注目していきます。
Go言語という新たなプログラミング言語
GO言語は、プログラミング言語の中では比較的新しい言語です。
発表されたのが2009年で、実際にリリースされたのは2011年。
当時はあまり受け入れられませんでしたが、ここ数年で急成長を見せ一躍メジャーなプログラミング言語となりました。
Go言語と呼称されることが多いですが「Golang」と表記されることもあるので注意してください。
Go言語の特徴を解説!
実はGo言語は、世界的なIT企業であるGoogleが開発しているプログラミング言語です。
ここからは、Go言語が持つ特徴について解説していきます。
Go言語の特徴は以下の4つが挙げられます。
- コンパイル・実行が高速
- シンプルなソースコード
- 可読性が高い
- 並行処理に強い
1つずつチェックしていきましょう。
コンパイル・実行が高速
Go言語は、書いたソースコードを「直接」機械語(ネイティブコード)に変換します。
そのため、コンパイルが早く、実行速度も高速です。
非常に有名なプログラミング言語・Javaは、中間言語を経由して仮想マシンで機械語に変換するという流れでコンパイルします。
直接か、中間言語を経由するかでは、その速度に差が生じるのはある意味当然なことといえるでしょう。
また、Go言語は内部処理も簡易化されているということでも高速処理を実現しています。
シンプルなソースコード
Go言語のソースコードは非常にシンプルです。
というのも、複雑な機能は初めから削ってしまっているためプログラムが複雑になることがありません。
シンプルなコードゆえにコーディング上のミスにも気が付きやすく、エラーが起こりにくいよう工夫されています。
仮にプログラム内で宣言されている変数が使われていなければ、コンパイルができなくなり、実行時のリスクを抱えたまま実行はしないという理念が垣間見えます。
コード自体が分かりやすいため、プログラミング初心者の方でも比較的習得しやすい言語だといえるでしょう。
可読性が高い
Go言語には「go fmt」というソースコードを自動でリファクタリングしてくれる機能が備わっています。
これを行うことでソースコードが整って非常に可読性の高いコードへ変貌するため、仮に他人が書いたコードでも読みやすいです。
そもそもGo言語は書き方のルールが厳格に定められているということもあり、コーディングで迷うことなくルールに沿った記述ができるようになっています。
並行処理に強い
Go言語は並行処理に強いという特徴も持っています。
そもそもGo言語は並行処理を前提として設計された言語とされており、Message-passing communicationが推奨されています。
「goroutine」を使えば、並行処理が簡単に実現。
このgoroutineはGo言語上で関数を実行すれば起動できるので、非常に簡単に実行可能です。
こちらに関しては後ほどGo言語の基本的なソースコードを紹介する際に、実際のサンプルコードと併せて解説いたします。
ちなみに、並行処理と並列処理が混同されがちですが、Go言語が採用しているのは「並行処理」です。
厳密には別の考え方のことなので、注意しておくといいでしょう。
Go言語とC言語など他のプログラミング言語との違い
プログラミング言語は非常に数多く、言語ごとに様々な特徴や違いを持っています。
Go言語は特にC言語やC++と比較されることが多いですが、中身は当然全くの別物です。
実行速度もGo言語が圧倒的に速く、C言語・C++とは比較するまでもないレベルの差があります。
また、C言語以外のプログラミング言語などと比較しても、とにかく「コードがシンプル」です。
他のプログラミング言語はできることや記述の方法が幅広いため、ソースコードを記述したエンジニアの強い個性がコードに表れることも珍しくありません。
対してGo言語は書き方が限定されているため、迷うことなくコーディングが可能です。
先ほど触れた特徴でも解説しましたが、その分誰でも読みやすいソースコードを記述できます。
Go言語でできること・作れるもの
続いては、実際にGo言語で何ができるのか、何が作れるのかというポイントを解説していきます。
特にGo言語が採用されているのは「Webアプリケーション」や「Webサーバー」です。
Webアプリケーション・Webサーバー
Webアプリケーション、つまりWeb技術を用いたアプリケーションソフトウェアは、高速で並行処理に強いGo言語がマッチしている分野といえるでしょう。
Go言語と同じくGoogleが運営しているYouTubeもGo言語を利用して開発されています。
Kyashやクックパッド、メルカリといった有名なWebアプリケーションもGo言語によって構築されており、幅広いWebアプリケーションで利用されています。
また、Go言語は標準パッケージでWebサーバーを構築可能です。
Webアプリ・サーバー共にGo言語で実現できるため、汎用性の高い言語といえるかもしれません。
スマホアプリ
Go言語はスマートフォン向けアプリケーションも開発できます。
JavaやKotlin、Swiftといったプログラミング言語がスマホアプリ開発では一般的ですが、Go言語でも「Go Mobile」を活用すれば開発可能です。
実際にGoogleのGo言語開発チームが作った「Ivy big number calculator」というスマホ電卓アプリがリリースされています。
興味のある方はインストールしてみてはいかがでしょうか。
PaaS
Platform as a Serviceの略であるPaaSはプラットフォームを借りてシステム開発・運用・保守が可能。
GoogleはGoogle App EngineというPaaSを展開していますが、こちらもGo言語に対応しています。
そしてGo言語はGoogle Cloud Platformとの相性も良いため、安心してPaaSに使えるプログラミング言語だといえるでしょう。
クラウドアプリ
Go言語には、Go Cloudとよばれる「クラウドアプリケーション開発」をサポートするオープンソースのライブラリ、ツールが用意されています。
ブログのストレージやMySQLなど特定のプラットフォームによらないクラウドAPIです。
Amazon Web Serviceにまで対応しており、Go言語を用いたクラウドアプリ開発を大きく手助けしてくれるでしょう。
基本的なGo言語のソースコードを紹介
それでは、実際にGo言語のソースコードを見てみましょう。
シンプルといわれるGo言語ですが、実際のコードはどのように構成されているのでしょうか。
Hello, World
まずはどのプログラミング言語でも基本のHello, World。
以下のソースコードで実行可能です。
- package main
- import “fmt”
- func main() {
- fmt.Printf(“Hello, World!”)
- }
シンプルなコードで文字の出力が実現するということが分かりますね。
goroutine(ゴルーチン)について
ではGo言語の特徴で触れた並行処理を実現しているgoroutineを解説しましょう。
関数を呼び出す前に「go」を付けることで、goroutine関数で実行可能です。
通常関数を呼び出す際は、頭に何も付けずに「関数名(引数,,,)」で実行しますが、それを「go 関数名(引数名,,,)」と記述することで、goroutine関数で実行ができるということになります。
goroutineは下記の3つの条件で終了するので、併せて覚えておきましょう。
- 関数が終わる
- returnで抜ける
- runtime.Goexit()を実行する
このように、並行処理を非常に簡単に実行できるのがGo言語の魅力であり、注目される要因です。
Go言語のメリット
それでは、実際にGo言語を採用した場合のメリットについて注目してみましょう。
Go言語のメリットは以下の6つが挙げられます。
- 高速処理
- メモリ管理のリスクが少ない
- 複雑なシステムでも構築が容易
- 言語単体で並行処理が簡単にできる
- クロスコンパイル
- 学習コストが低い
1つずつ解説いたします。
高速処理
特徴でも触れましたが、Go言語は高速処理を実現しています。
これは単純に開発の効率が高くなるというだけではありません。
機械語へ直接コンパイルするため、必要とするメモリリソース量も少なく、結果として軽いアプリケーションが作りやすくなります。
同じ処理を実行していても、消費リソースはJavaの約30分の1程度ともいわれており、Go言語の軽さが際立っているといえるでしょう。
実行時のパフォーマンスも良くなるため、Go言語の特徴である「高速処理」は大きなメリットです。
メモリ管理のリスクが少ない
Go言語にはポインタという概念が存在しません。
C++などではポインタを用いてメモリの番地同士で計算や処理などが可能ですが、Go言語ではそういったことができないということです。
意図しないデータがその番地に入っていたとしたら、エラーや予期せぬ処理を実行してしまう可能性があります。
また、ポインタを悪用したウイルス等も存在しており、そのようなリスクを未然に防ぐ結果に繋がっています。
複雑なシステムでも構築が容易
Go言語はこの記事でも触れている通り、コードを書くルールが明確に定められています。
そのため、プログラマーごとに表記揺れの差が生じにくい言語です。
そのため、大人数のエンジニアが携わるような大規模プロジェクト・システムでも安心して採用できます。
また、同期処理なども行えるため、複雑なシステムでも使うことが可能です。
言語単体で並行処理が簡単にできる
記事中でも何度か触れている「並行処理」がGo言語の大きな魅力の1つです。
Go言語はプログラミング言語単体で並行処理が可能ですから、CPUの性能を簡単に引き出すことができます。
ソフトウェアへの実装も円滑に行えるでしょう。
クロスコンパイル
Go言語はクロスコンパイルに対応しているプログラミング言語です。
つまり、開発しているOSとは異なる環境でも実行可能なコードを自動で生成してくれるため、OSやソフトウェアが異なっていても実行できてしまいます。
プラットフォームを問わずに実行可能なものを開発可能ということです。
学習コストが低い
Go言語は言語構造がシンプルということもあって、学習コストが低い言語だといえます。
他の言語と比較しても短期間で習得ができ、仮にプログラミング初心者の方だったとしても大きく苦戦せずに学習できるでしょう。
当然プログラミング経験者の方であれば、ちょっとしたGo言語のクセに慣れてさえしまえば、習得は非常に容易です。
Go言語のデメリット
続いてはGo言語のデメリットをチェックしてみましょう。
メリットの裏返しにもなる部分もありますが「genericsがない」ということや「継承がない」というデメリットが存在しています。
genericsがない
Go言語にはポインタが存在しないということは既に解説いたしました。
これはメモリ管理をセキュアなものにするためという理由なのですが、同じ理由で「generics」も実装されていません。
Javaのgeneric typeのように書くことはできないため、デメリットと感じる方も多いでしょう。
しかし、これによってセキュアなメモリ管理を実現しているため、一概にデメリットだとはいえません。
継承がない
C++やJavaで頻繁に使う「継承」という考え方ですが、Go言語で継承はサポートされていません。
継承を普段から頻繁に使用しているプログラマーの方にとっては大きなデメリットに感じるポイントです。
しかし、継承はコードが複雑になればかえって可読性が下がる可能性のある要素です。
Go言語は「シンプルで読みやすくメンテナンスのしやすいコード」という観点を重要視しています。
だからこそGo言語の可読性が高いものとなっているため、これもメリットでもあるポイントだといえるでしょう。
メリットとデメリットは表裏一体
メリットとデメリットの両面に注目してみましたが、デメリットとして紹介した2つはどちらもメリットの裏返しといえる内容でした。
Go言語が持つ特徴の結果デメリットに感じてしまいますが、そのデメリットはメリットに繋がっています。
継承が使えないというのは抵抗を覚えるプログラマーも多いかもしれません。
しかし、そのおかげでシンプルなコードが実現され、学習コストも低くなっています。
可読性も高まり、ソースコードの管理も容易になっているといえるでしょう。
デメリットではなくメリットに目を向けるべきです。
エンジニアとして力を付ける
今回紹介してきたGo言語は、一気に注目を集め始めているプログラミング言語です。
様々なWebアプリケーションなどで採用されていることからも分かる通り、これからのIT業界で非常にメジャーな言語になるであろうことが予想されます。
IT業界に携わるエンジニアとして、必ずチェックしておくべき言語だといえるでしょう。
学習コストも低いため、すんなりと習得できるかもしれません。
これからもIT業界の第一線で活躍をするために、エンジニアとして力を付けるために、Go言語を学習してみてはいかがでしょうか。