【入門】Go言語とは?メリット・デメリット、将来性は?

再来月から転職先の企業でGo言語を利用したサーバ開発を行うこととなりました。初めてGo言語を扱うので勉強を開始しようと思います!

まずは、Go言語がどういう言語か、特徴やメリット・デメリットなど概要をまとめます。

まだGo言語を深く触れていないので、もし間違いなどありましたらご指摘いただけますと幸いです。
また、実際に触って感じた生の特徴については今後改めて記事にする予定です。

目次

Go言語とは?

Go言語は、Googleが2009年に開発したオープンソースのプログラミング言語です。2021年7月現在、最新バージョンGo1.16.6がリリースされています。

Goは静的型付けのコンパイル言語であり、処理が高速、並行処理に強いなどの特徴があります。
また、サポート環境について、発表当初はLinuxとMac OS Xのみのサポートだったようですが、現在はWindows、Android、iOS、Google App Engine、WebAssemblyを全てサポートしています。

近年はGo言語を利用する企業が増えており、Twitter、Facebook、Uber、Netflixなど世界で名を馳せている有名企業でもGo言語が採用されています。国内でも多くの企業が採用を始めており、注目度が高まっています。
また、5Gの浸透により今まで以上に大量データを通信する必要が生じているため、並行処理を得意とするGo言語の需要が高まっているという背景もあります。

このように国内外多くの有名企業が採用していることや、5Gが浸透しているという環境もあり、現在最注目プログラミング言語の一つと言えるでしょう。

Go言語で何ができる?

Webサーバー・アプリケーション開発

Goは、開発者がスケーラブルで安全なWebアプリケーションを迅速に開発できるように設計されています。Goには、使いやすく、安全でパフォーマンスの高いWebサーバーが付属しており、独自のWebテンプレートライブラリが含まれています。Goは、HTTP / 2から、MySQL、MongoDB、ElasticSearchなどのデータベース、TLS 1.3を含む最新の暗号化標準まで、すべての最新テクノロジーを優れた方法でサポートしています。Go Webアプリケーションは、Google AppEngineとGoogleCloud Run(簡単にスケーリングできるようにするため)、またはGoの優れた移植性のおかげで、あらゆる環境、クラウド、オペレーティングシステムでネイティブに実行されます。

https://go.dev/solutions/webdev/

上記のようにGo言語はWebサーバー・アプリケーション開発に適した特徴を持っているため、多くのWeb開発で利用されています。

また、Web開発において以下のような利点があると記載されています。

単一のバイナリにコンパイルします—「静的リンクを使用して、実際にすべての依存関係ライブラリとモジュールをOSのタイプとアーキテクチャに基づいて単一のバイナリファイルに結合します。」

静的型システム—「型システムは大規模なアプリケーションにとって非常に重要です。」

パフォーマンス—「同時実行モデルとCPUスケーラビリティにより、パフォーマンスが向上しました。内部リクエストを処理する必要があるときはいつでも、Pythonスレッドよりもリソースが10倍安い個別のGoroutineを使用して処理しています。」

Webフレームワークは必要ありません—「ほとんどの場合、サードパーティのライブラリは本当に必要ありません。」

優れたIDEサポートとデバッグ—「すべてのプロジェクトをGoに書き直した後、以前よりも64%少ないコードを取得しました。」

https://go.dev/solutions/webdev/

モバイル向けアプリケーション開発

Go言語は iOS / Android をサポートしているため、スマートフォンで動作するアプリの開発も可能です。iOSやAndroidアプリ開発用の「Go Mobile」というパッケージを活用することで、比較的手軽な形でモバイルアプリを開発することが可能となります。

ロボティクス・IoT

Go言語はドローンやロボットなどIoT開発も可能になります。ロボティクスやIoT開発向けのフレームワーク「Gobot」を活用することで、比較的手軽な形でロボット開発、デバイス連携・センサーの制御を開発することが可能となります。

例えば、Ryze Tech社が開発・販売しているトイドローンTelloをGobotが対応しているため、Telloの操縦やカメラ撮影をGo言語により操作することが可能です。

CLI開発

プラットフォーム間における移植性、高パフォーマンス、および作成の容易さから、CLI開発においてもGo言語が適しています。事例として「GitHubコマンドラインツール」でもGo言語が利用されているようです。

Go言語のメリット

処理が高速

Go言語は静的型付け言語であるため、ソースコードを機械語にコンパイルする必要があります。一方、PHPやPythonのような動的型付け言語の多くのインタプリタ型言語は、実行時に一行ずつ機械語に変換して実行します。そのため、事前に機械語に変換して最適化されるコンパイラ型言語は、インタプリタ型言語と比較して実行速度が速いという特徴があります。

さらに、同じコンパイラ型言語であるJavaは中間言語に変換しますが、Go言語は直接機械語に変換するため、コンパイル型言語の中でも処理が早いと言われています。

並列処理が得意

Go 言語の特徴はいくつかあるが,大きなものとして「並行処理」を前提とした言語設計が挙げられる。

並行処理では CSP (Communicating Sequential Processes) の成果が取り入れられている。 これが goroutine と channel である。

Goroutine は軽量スレッドなどと呼ばれることもあるが,厳密には coroutine の一種である。 Main goroutine を含む各 goroutine はランタイム・プログラムに組み込まれたスケジューラによって制御される。 つまり実行時の並列処理の詳細はコードレベルでは隠蔽されているのだ。 故にプログラマはコード上の並行処理にのみ注力して記述すればいいことになる。 OS スレッドの仕様がどうなってるとか無駄にデカいスレッドをプールの中でどう使い回すかとか,生産性の欠片もないようなことは考えなくていいわけだ。

Channel は入出力プリミティブで,これによって goroutine 間のメッセージ・パッシング(message passing)を実現している。

https://text.baldanders.info/remark/2018/11/concurrency-in-go/

Go言語は並列処理を前提として設計されているため、並列処理を得意としています。
goroutineとchannelなどの機能により、内部仕様を気にせずに簡単に並列処理を記述することが出来ます。

メモリ安全性が高い

Go言語にはGC(ガベージコレクション)機能が備わっています。GCとは不要になったメモリを解放する機能です。C言語やC++ではプログラマがメモリ管理する必要がありましたが、GCが備わっている言語では自動的にメモリ管理が行われます。そのため、メモリの解放し忘れによるメモリリークを自動で回避することが出来ます。

シンプルな言語仕様

Go言語は他言語と比較して機能が削ぎ落とされており、シンプルな言語仕様となっています。
例えば、繰り返し処理で良く利用されるwhile文がGo言語には備わっていません。Go言語で繰り返し文を記述する場合、必ずfor文を利用して記述することになります。そのため、誰が書いても同じような記述になり、コードに統一感が生まれやすいのです。

他にも、「継承」「Generics」「例外」のような機能もGo言語には備わっていません。この辺りはメリットとデメリットが表裏一体となっているようにも思うので、継承やGenericsなどの書き方に慣れている方にとってはデメリットに感じ方もいるかもしれません。しかし、削ぎ落とされてシンプルになっているからこそ、初学者でも学習しやすく、熟練者と同じように可読性が高くバグを排除したコードを書きやすい、という特徴を実現しています。

クロスプラットフォーム対応

Go言語は1つのソースコードから様々なOS用のバイナリを生成するクロスコンパイルをサポートしています。そのため、OSやソフトウェアが異なるシステム上でも実行できます。

以上のメリットから、Go言語は複雑かつ大規模なシステム構築に最適とも言えるでしょう。

Go言語のデメリット

以下はデメリットというよりもGoというプログラミング言語の設計思想と捉えるべきかもしれません。

継承がない

Go言語には「継承」が備わっていません。Embeddedという機能を使うことで継承と似たことが出来そうなのですが、違うようです。違いはこちらの記事で解説されていたので、興味のある方は参照ください。
https://qiita.com/Maki-Daisuke/items/511b8989e528f7c70f80

Genericsがない

Go言語には「Generics(ジェネリクス)」が備わっていません。Go言語ではあらかじめメモリの値の型を宣言しなければならないため、Genericsは使用できないようです。

例外処理がない

Go言語には「例外処理」(Javaでいうtry-catch-finallyなど)が備わっていませんGo言語では複数の値を関数の呼び出し元に返却できるため、エラーが発生した場合は例外を投げるのではなく、戻り値としてエラーを返却することによりエラーハンドリングを実現しています。

Go言語の将来性

Google Trends でGo言語と他言語の人気度を比較することで将来性を予想しました。あくまで予想であるということをご留意いただければと思います。

Google Trends による人気度の動向

■全ての国

「全ての国」で比較すると、Pythonに上昇傾向が見られ、Go言語は横這い、PHPとJavaは減少傾向であることがわかります。

■日本

「日本」ではまだまだGo言語の人気は少ないことがわかります。しかし、最新のデータ(2021/7付近)を見るとGo言語がRubyを逆転しそうであることが見て取れます。Go言語の需要も伸びそうですが、上昇傾向であるPythonの人気が今後も高まりそうですね。

■アメリカ

「アメリカ」ではPHPよりGo言語の方が人気が高いことがわかります。しかし、まだGo言語はほとんど横這いです。Javaは減少傾向であるため、この傾向が続けば、(半分期待を込めて)Go言語とJavaが逆転する可能性はあるかもしれません。

■中国

「中国」ではGo言語に上昇傾向が見られ、最新のデータ(2021/7付近)ではJavaとほぼ同じ数値であることがわかります。今後PythonとGo言語が主流になっていくと予想できます。

複数の国でサーバサイド言語のトレンドを比較したところ、特に中国でGo言語人気が高まっていることがわかりました。日本は現状まだまだGoの需要は少ないですが、世界トレンドを追従していくと予想します。

よかったらシェアしてね!

コメント

コメントする

CAPTCHA


目次
閉じる