新規開発でGo言語を採用してみた

はじめに

こんにちは。エンジニアの木村です。

今まで、業務ではPythonを使っていたのですが、新規プロジェクト(Web API開発)でGo言語を採用しました。

本記事ではGo言語を採用した動機、Go言語の使用してみた感想、学習したリソースを述べたいと思います。

Go言語

Go言語は2009年にGoogleが公開したプログラミング言語でGoogle内の課題を解決するために開発された言語です。

特徴

  • 強力でシンプルな言語設計と文法
  • 並行プログラミング
  • 豊富な標準プログラミング
  • 周辺ツールの充実
  • シングルバイナリ・クロスコンパイル

Go言語でできること

  • クラウド・ネットワークサービス
  • CLI開発
  • Web開発
  • DevOps・SRE

Go言語を採用した動機

静的型付け言語である

Pythonを用いた開発を行ってきた上で、一番の不満は動的型付け言語であるということでした。

コンパイラを走らせずそのまま実行できるという点では動的型付け言語は手軽で良いのですが、プログラムを実行するまで潜在的なバグを検出できないという点は業務レベルのソフトウェアを開発する上ではつらい部分でもありました。

また、型を書くことはソースコード内のドキュメント代わりにもなるので、チーム開発や継続的な開発における保守のしやすさにもつながります。

学習が(比較的)容易

言語仕様が簡素、公式ドキュメントが丁寧、学習リソースが豊富といったこともあり、他のコンパイラ言語と比べてもかなり学習しやすいです。
社内のメンバーがGo言語をキャッチアップするコストが小さいことも大きな利点です。

標準ライブラリと周辺ツールが豊富

Go言語では外部ライブラリを頼らなくても大概の開発を行うことができます。
Webフレームワークも標準ライブラリのラッパーでできているぐらいなので、標準ライブラリを理解していれば外部ライブラリを難なく使うことができます。

また、モジュール管理、テスト、ビルドツールも標準で搭載されているので、環境構築も楽ちんです。

外部ライブラリに依存しすぎると開発停止のリスクがあるので外部ライブラリにあまり依存しないで開発できることは素晴らしいです。
(以前のプロジェクトで、外部ライブラリの開発停止により痛い目にあいました…。)

並行処理に強い

goroutineやチャネルなどの並行処理機能を標準で備えており、ネットワークアプリケーションのような並行処理が生命線となるようなプロジェクトに強いです。

クラウドネイティブ

AWS LambdaやCloud Functionsなどのサーバーレス環境で実行環境が用意されています。
また、サーバーレス構成だと関数呼び出しのたびにインスタンスを起動するため、起動時のオーバーヘッドが小さい点もサーバーレスとの相性が良いと感じます。

また、シングルバイナリでコンテナとの相性も良いです。

他言語でのWeb API開発の知見が少なかった

これが最大の要因といっても過言ではありません。
自社のみでWeb API開発を行うことが初めてだったので、社内に知見がたまっていませんでした。
なので、思い切って新しい技術に挑戦することにしました。

Pythonとの文法の違い

自分が気になったPythonとのGoの文法の違いをピックアップしてみました。

クラス

Goではclassに相当する文が存在しません。

例として、フィールドにname(string)、nameに挨拶をするメソッドをもつgreetというオブジェクトを考えます。

こちらがPythonでの実装です。

class greet:
  def __init__(self, name):
    self.name = name

  def hello(self, name):
    print(f"hello {name}")

一方、Goでは代わりに構造体を用いてオブジェクトを表現します。
構造体をレシーバーにしてメソッドを実装します。

type struct greet {
  name string
}

func (g greet)helloworld(name string) {
  fmt.Printf("hello %s\n", name)
}

例外処理

割り算で0で割った際の例外処理を例にします。

Pythonの例外処理はtry-except構文を使用します。

type struct greet {
  name string
}

func (g greet)helloworld(name string) {
  fmt.Printf("hello %s\n", name)
}

一方、Goにはtry-exceptのような例外機構が存在しないため、関数がエラーを戻り値として返すことで例外処理を実現しています。

func division(x, y float64) (float64, err) {
  if y == 0 {
    return nil, errors.New("Divided by zero")
  }
  return x/y, nil
}

使ってみた感想

言語仕様がシンプルなため覚えやすく、誰が書いても似たようなコードになるため読みやすいという点が良かったです。一方、シンプルが故に他の言語ではあった機能が無いといったデメリットもありました。

また、リンターや静的解析をVScode上で行うことができるので開発効率も高く、チーム開発を行うのに適していると思います。

これからは、ちょっとしたコードを書いたりデータサイエンス分野の開発ではPythonをそれ以外では全てGoを使うといったスタイルで行こうかなと思うぐらい気に入りました。

使用した学習リソース

自分がGoを学習したい際に使用した学習リソースです。
まずはA Tour of Goで基本的な構文を押さえてから、他の学習を進めると良いかと思います。

公式(Web)

非公式(Web)

書籍


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA