気軽く読むGO言語の概要

2021.05.24

はじめに

おはようございます、ソウヌです。時間が経ついにつてGO言語の人気がどんどん高まって行っています。それでGO言語を勉強したい方々のためにGOについて簡単に紹介するこの記事を作成するようになりました。GOを勉強する前に気軽く読んでみたらいいと思います。

GO言語とは?

グーグルから開発されたプログラミング言語で、2009年に初めて発表されて2012年に1.0バージョンがリリーズされました。 GOは高い性能、安定性、利便性、手軽いプログラミングが目標で開発されました。 GOの公式ホームページにはGOを「シンプルで、信頼性が高く効率的なソフトウェアを簡単に構築できるオープンソースプログラミング言語です。」と説明しています。

GOを使ったプロジェクト

GOは多くの企業さんはもちろん多くの分野にも幅広く使われている言語です。

GOを使っている企業さん

GOを開発したGoogleはもちろん、Twitch・Youtube・NetfilxなどStreaming サービスにも使われています。そしてブロックチェーンプラットフォームのイーサリアムの公式クライアントソフトソフトウェア(geth)がGOで開発されました。

GOが活躍している分野

  • 分散ネットワークサービス
  • 並列処理の強みがあるGOはマイクロサービスやAPI・WEB開発によく使われています。
  • クラウドネイティブ開発
  • DockerやKubernetesなどのクラウドネイティブサービスはGO言語で開発されました。
  • モバイルアプリケーション開発
  • まだGOを使ったモバイルアプリのプロジェクトは少ないですが、Android・iosアプリケーションをGOで開発できます。

このようにGOは幅広く使われているし、その性能や安定性を認められた言語と言えます。

GOの特徴

なぜGOがこのように人気があるのか、どのような特徴があるのかみてみます。

GOの特徴は下の通りです。

  • 静的型付け, 強い型付け
  • Concurrency(並行性)
  • Multi core 環境支援
  • 早いコンパイル(GCあり)
  • 高い生産性 GOの特徴以外にどのような長所や短所があるのか話します。 簡単に話すとGOは下の長短所があります。

長所 - シンプル、ものすごいコンパイル、並行処理、高い生産性 短所 - ないのが多い(ジェネリック・例外処理など)

GOの長所

シンプル

シンプルさはGO言語の1番の長所だと思います。 GOは直感性・単純性・明瞭さ・効率性を目標として設計されたので、とても簡単です。 そのため覚えることが少ないです。例えばGOとPythonのキーウードを比べると

GOのキーワード

pythonのキーワード

GOは25個、Pythonは35個でGOの方がもっと少ないです。

そして他の例で、反復文の作成があります。反復機能を使用するため、 Javascriptはfor, forEach, for in, for of, while, do while, .map, .filterなど多くの方法があります。これを全部覚えるのはけっこ大変です。 しかし、GOはfor, for rangeだけで反復文を表現できます。

簡単な文法・少ないキーウードなど、結局GOは習得しやすい言語と言えます。

ものすごいコンパイル

GOはJAVAのようにガベージコレクション(GC)があり、メモリの管理がしやすいです。 そしてネイティブバイナリ形式で、バチュアルマシン(VM)を使わずにコンパイルを行うので処理速度がとても早いです。

JAVAやC#は実行ファイルじゃなくバイトコードとIL(Intermediate Language, 中間言語)を生成します。 そして、そのバイトコードとILはVMの上で実行されます。

しかし、GO言語はC・C++のように完全な実行ファイルを作ります。そのためGOはJAVAやC#のようにプログラムを実行するためのVMを設置する必要がないので処理速度が早いし、実行環境も簡単です。

平行処理

GOがマイクロサービスやクラウドネイティブなどで活躍できる理由は、GOの平行処理能力がとても強いからです。 GOにはGo routineという軽量スレッドがあります。goというキーワードを使用して複数の関数を同時に実行できます。そしてチャンネルを使ってgo routineはお互いに通信でき、実行順番をコントロールすることができます。

短所

無いのが多い

GOにはないのが多いです。このようなことは「シンプル」という長所になることもありますが、逆に短所にもなれます。

ジェネリックなし

その中で体表的なことはジェネリック文法がないことです。 GOは単純さ・実用性を志向している言語であるので、明確さや単純性を保ちながらジェネリックを追加することがとても難しいです。しかし1.18バージョン(現1.16)またはGO2でジェネリックが追加される予定であるのでこの問題は解決できると思います。

例外処理文法なし

そしてGOは例外状況を許可しないです。そのためtry-catchのような例外処理文法がないです。 例外処理をするためには2つの仕組みがあります。

  1. if文でエラーの発生を確認する。(名詞的なチェック) - 普通の状況
  2. panic, recoverを使用する。- 深刻な状況

1. if文でエラーの発生を確認する場合

GOは基本的に提供しているエラータイプでエラーの状況を表します。 エラータイプは下の通り、インタフェースで定義されています。

type error interface{
Error() string
}

GOの関数は最後の返り値でerrorを返り、エラーの確認や対応ができます。 このようにエラーを確認するため一つ一つif文を作成するのはとても面倒なことですし、コードもかなり長く(または読みにくく)なります。

2. panic, recoverを使用する場合

panic, recoverを使用する場合はプログラムに深刻な問題が発生する時に使います。 深刻なエラーでプログラムの起動ができない時、panic()関数を使用して強制的にプログラムを終了することができます。 recover()関数はプログラムの制御権をまた得て、終了手順を中断してプログラムをまた続けていきます。recover()関数は必ずdeferの中で使わなければなりません。

簡単な例です。

func errTest(){
defer func() {
s := recover()
fmt.Println(s)
}()
panic("Panic Test")
}

func main() {
errTest()
fmt.Println("Recover Test")
}

強いライブラリ(フレームワーク)の不在

各プログラミング言語には様々な強力的なライブラリ・フレームワークがあります。 例えば python - django,javascript - react, php - laravelです。 しかし、GOにはこのように主に使われるフレームワークがないので初心者には何を使ったらいいのか開発方向を決めることが難しいです。 代表的にGin,BEEG,echoなどのフレームワークがありますが、その情報については下のリンクを参照すればいいと思います。

https://github.com/mingrammer/go-web-framework-stars

終わりに

GOの人気はどんどん増えて行っています。GOが持っている長所が最近のWEB開発のトレンドとよく合う言語ですので、弱みよりも強みが多い言語だと思います。 本内容がGO言語に興味がある方にお役に立てれば幸いです。ありがとうございます。