Go言語超入門編

2020年07月17日

先日、弊社内で毎月恒例の技術勉強会が開催されました。
本記事ではその勉強会で発表されたGo言語の特徴やメリットについてご紹介していきます。
Go言語超初心者(私)による発表内容ですので、
同じようにGo言語の開発経験がない方や学習し始めて日が浅い方向けの内容となっております。
そのような方々の少しでもお力になれれば幸いです。

Go言語とは?

Go言語とは?

2009年にGoogleが開発したオープンソースプロジェクトのプログラミング言語です。
ロブ・パイクとケン・トンプソンにより設計され、2012年にバージョン1.0がリリースされました。
主にWebサーバーアプリケーションとして利用されています。
規模の大きいプロジェクトに向いており、問題解決にフォーカスしたバランスの良いプログラミング言語として高い人気を誇っています。

なぜGo言語が作られたのか

製作者のロブ・パイク曰く
「Goの目的はプログラミング言語設計の研究ではなく、設計者やその同僚の作業環境を改善することにあります。(Go’s purpose is therefore not to do research into programming language design; it is to improve the working environment for its designers and their coworkers.)」(参照:https://talks.golang.org/2012/splash.article)
この発言からGoはプログラミング言語の研究というよりも、
ソフトウェアエンジニアリングの改善のために作られた言語と言うことができます。

そこでGo言語は、従来の言語と比べてシンプル、かつ見た目でも分かりやすくなることを意識されて作られています。
仕様書もシンプルで、Googoleの新入社員でもいきなり大規模システム開発への参加や成果を出せる言語、という言い方もされていたりします。

Go言語の特徴

ここでGo言語の特徴をいくつかご紹介していきます。

実行速度が速い

他のプログラミング言語よりも圧倒的に速い!というわけではありませんが
最速を争える速度ではあると考えられています。

並列処理に強い

Go言語は並列処理を得意としています。
goroutineやチャネルなどの機能を使うことでCPUへの負荷などを気にせずに処理を進めることができます。

拡張性が高い

小さい機能を必要に応じて複数組み合わせることで高い機能性を実現しています。

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

“クロスコンパイル”(ソースコードを元に、開発しているOSとは異なる環境向けに実行可能なコードを生成すること)が可能であるため、OSやソフトウェアが異なるシステム上でも実行が可能です。

消費リソースが少ない

Javaと同様に処理は高速ですが、同じ処理を実行しても使用するメモリはJavaの1/30ですませることができます。

シンプルな言語構造

複雑な機能は削り至ってシンプルな言語構造にすることで、高速コンパイルの実現やミスを軽減させています。

誰が書いたコードでも読みやすい

ソースコードを自動的に整形してくれる “gofmt” を利用することで、ソースコードの見た目が整い非常に見やすくなります。
書き方のルールが厳格である為、記述に迷うことなく決まった書き方で開発が進められます。

このようなGo言語の特徴の中から、次にいくつかの機能を下記にご紹介したいと思います。

gofmtについて

コマンドラインで“gofmt”と打つことでソースコードを自動で整形してくれる便利な機能です。この機能によって先述の通り、誰が書いたコードでも読みやすくなります。
例として、hello worldを出力するファイル(hello.go)で試してみたいと思います。

コマンドライン

左が整形前、右がgofmtによる整形後です。

行間やインデントの挿入等が自動的に行われ見やすくなりました。

gotourineについて

gotourineについて

次にGoroutine(ゴルーチン)について簡単にご説明します。
GoroutineとはGo言語において並列処理を実現させる仕組みです。

並列処理とは?

とても端的に言うと、複数の処理を同時に行う処理のことを並列処理と呼びます。
カレーライスを作る場合を例にして見てみましょう。

カレーライスを作る際にざっくりと
・ご飯を炊く
・カレーを煮込む
・お皿に盛る
という3つの作業があるとします。(具材の下準備は既にできているものと仮定します)

この時、「ご飯を炊く」作業と「カレーを煮込む」作業が同時に行われていれば
ご飯もカレーも温かいまま、「お皿に盛る」作業ができます。
また時間的にも効率よくカレーライスができあがります。

ですが、どこかの作業で問題が発生した場合、原因を発見しづらいというデメリットがあります。

また、並列処理に対して、並行処理というものもあります。
こちらも端的に言うと1つの処理を終えてから次の処理を開始する処理のことを並行処理と呼びます。

先程と同様、カレーライスを作る場合を例にしてみましょう。
並行処理は1つの処理を終えてから次の処理を開始するので
下の図のように、「ご飯を炊く」作業が終わってから「カレーを煮込む」作業に入ります。
そうするとご飯は冷めてしまい、できあがる時間も並列処理と比べると遅くなってしまいます。

しかし、並行処理は処理のどこかで問題が発生した場合、どの処理のどの部分が原因なのかが発見しやすいというメリットがあります。

どちらにもメリット・デメリットはありますが、goroutineでは前者の並列処理を行うことで、実行速度を早くすることを実現しています。
goroutineは実行したい関数の前に”go”と記述するだけで使用できます。

channnelsについて

goroutineとgoroutine間でデータの送受信をする機能です。
make(chan 型)で新しいチャネルを作成。
channel <- 構文で、チャネルへ値を 送信
<-channel 構文で、チャネルから値を 受信

最後に

弊社のCMSTUDIOというサービスでは実際にGo言語を用いたAPIを利用しており、受託案件でもGo言語で開発する機会が徐々に増えてきております。
実際に私も触れる機会がありましたが、記事内でも言及した通り、プログラミング初心者の私でも比較的とっつきやすい言語だと感じました。
今回ご紹介したのは超入門部分に過ぎませんが、個人的には将来性がある言語だと思います。
習得できるように日々頑張りたいです。

参考サイト
https://employment.en-japan.com/engineerhub/entry/2018/06/19/110000
https://talks.golang.org/2012/splash.article
https://qiita.com/taji-taji/items/6d286bf4483a4c6ceed6
https://qiita.com/taigamikami/items/fc798cdd6a4eaf9a7d5e
https://itpropartners.com/blog/10984/
https://arma-search.jp/article/go-speed
https://doruby.jp/users/nakamatsu/entries/%E3%80%8C%E3%81%AA%E3%82%93%E3%81%A8%E3%81%AA%E3%81%8F%E3%80%8D%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%89%E3%81%9B%E3%81%A6%E3%81%BE%E3%81%9B%E3%82%93%E3%81%8B%EF%BC%9F%22%E3%81%84%E3%82%89%E3%81%99%E3%81%A8%22%E3%81%A7%E8%A6%9A%E3%81%88%E3%82%8B%E4%B8%A6%E5%88%97%E3%81%A8%E4%B8%A6%E8%A1%8C%E3%81%AE%E9%81%95%E3%81%84

前の記事へ 一覧を見る