Goとは?特徴や仕事に使うことを目指すための勉強法などを解説

Goは2009年にGoogleによって公開されたプログラミング言語です。Go言語やGolangと表記されることもありますが、ここでは公式のFAQの回答に合わせて正式名称のGoを用います。Kubernetesをはじめとするクラウド関連のOSSやスタートアップから大規模開発までさまざまな開発規模のサーバサイドで用いられています。また、Goは言語仕様がシンプルなため、プログラミングを始めたばかりの方でも学習しやすい言語です。

Go言語案件を提案してもらう

本記事の執筆者
上田 拓也 (うえだ たくや)

メルカリ/メルペイ所属。 バックエンドエンジニアとして日々Goを書いている。 Google Developer Expert (Go)に認定され、 Go Conferenceを主催する。golang.tokyoGoビギナーズGCPUG Tokyoの運営も行う。 大学時代にGoに出会い、それ以来のめり込む。 社内外で自ら勉強会を開催し、Goの普及に取り組んでいる。 マスコットのGopherの絵を描くのも好き。人類をGopherにしたいと考えている。著書には『改訂2版 みんなのGo言語』『逆引きGoによる静的解析』などがある。

Webサイト : https://tenntenn.dev/ja/
Twitter : @tenntenn

目次

Goとは?
Goでできること・仕事で活躍するシーン
Goエンジニア入門のための学習ステップ

ご登録者様限定機能詳しく見る

Goとは?

GoはGoogleの社内で起きていた、プログラム同士の複雑な依存関係やビルドの遅さ、コードの読みにくさ、静的解析ツールなどの自動化ツールの作りづらさなどの課題を解決するために開発されました。2009年に発表され、2012年に正式バージョンであるGo 1.0が公開されました。2021年5月現在では、Go 1.16が最新版です。

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

Goはシンプルさを大事にしています。一見、Goは目新しい機能が少なく、退屈な言語に思えるかもしれません。しかし、複雑な機能は可読性やビルド速度に悪影響を与え、開発効率の低下を招きかねません。Goはあえてシンプルさを維持することで開発しやすい言語になっています。

Goはゴールーチンとチャネルと呼ばれる機能により並行プログラミングをサポートしており、大規模な並行処理を比較的簡単に開発できます。また、プログラムを並行に実行することで、効率的に処理を行えます。

Goでは標準ライブラリとして100を超えるパッケージが用意されています。また、標準ライブラリでは無いもののGoの開発チームが管理する準標準的なライブラリも多数用意されています。

言語がシンプルに作られているため、静的解析ツールをはじめとした開発支援ツールが非常に充実しています。標準のツールだけでもgofmtやgoimportsなどのコードフォーマッタや静的解析ツールのgo vet、エディタや統合開発環境から用いられるgoplsなどがあります。この他サードパーティ製のものも多く存在しています。

Goのプログラムは特別なオプションを指定せずにビルドを行うと1つの実行可能ファイル(シングルバイナリ)を生成します。その中には、ランタイムや依存するパッケージなど実行に必要な情報がすべて入っています。そのため、ビルドされた実行可能ファイルをサーバ上に置くだけで簡単にデプロイできます。また、クロスコンパイルが可能なため、開発しているPCと異なるOSやアーキテクチャ向けの実行可能ファイルを生成することもできます。

Goはバージョンが1.xである限り後方互換を保つという約束がなされています。そのため、バージョンアップによって言語仕様や標準ライブラリに破壊的な変更が入ることが無いため、Go 1.0で書かれたプログラムもGo 1.16でビルドできます。しかし、何も改善が無いという訳ではなく、バージョンアップによって新しい機能が増えたり、ランタイムや標準パッケージのパフォーマンスが改善されたりしています。ジェネリクスなどの大きな機能もシンプルさを維持しながら言語に破壊的な変更を加えずマイナーバージョンアップで取り入れられる予定です。

Go言語案件を提案してもらう

Goでできること・仕事で活躍するシーン

毎年、Goの開発チームが行っている調査によると、GoはWebサービスのサーバサイド(APIやRPC)やコマンドラインツールの開発に用いられることが多いです。国外においては誰もが知っている企業やサービスで用いられており、Go Wikiに掲載されているようにスタートアップから大手企業まで多数の企業がGoを採用しています。

サーバサイドの開発

Goが標準で提供しているnet/httpパッケージを用いると、HTTPサーバを簡単に構築できます。HTTPクライアントの機能も提供されているため、APIクライアントの開発も簡単に行えます。

※参考 : https://go.dev/solutions/webdev/

Cloud Native Computing Foundation(CNCF)のプロジェクトのうち、75%以上でGoが使われており、クラウド技術を発展を支えています。また、Google Cloud Platform(GCP)やAmazon Web Services(AWS)、Microsoft Azureなどの主要なクラウドプロバイダがSDKを提供しており、Goで開発したアプリケーションをクラウド上で運用しやすくなっています。

※参考 : https://go.dev/solutions/cloud/

マイクロサービスアーキテクチャによる開発においてもgRPCなどの技術と共にGoを用いるシーンは多いでしょう。gRPCはGoogleで開発され、OSSとして公開されているリモートプロシージャコール(RPC)システムです。GoはgRPCで公式にサポートされている言語の1つです。

※参考 : https://grpc.io/docs/languages/

コマンドラインツールの開発

Goはコマンドラインツールの開発に必要な多くの機能を標準で提供しています。例えば、flagパッケージを用いるとコマンドのオプションを処理できます。また、encodingパッケージを用いるとXMLやCSVなどの形式も扱えます。

準標準なパッケージであるgolang.org/x/textパッケージでは、文字列処理に関する機能を提供してします。Shift JISやEUC-JPなどの日本語の文字コードを扱えう機能や半角から全角に変換する機能なども提供しています。

Goのプログラムはビルドするとシングルバイナリになるため、ポータビリティが高く配布やデプロイが用意に行えます。また、クロスコンパイルができるため、開発環境に依存せず多くの環境に対応したツールが開発できます。

Goエンジニア入門のための学習ステップ

Goを学ぶ意義

国内外でGoに関する大規模なカンファレンスが毎年開催されています。国内においてもGo Conference 2021 Springでは登録者が1000名を超えるなどその関心の高さが伺えます。また、Goは言語仕様がシンプルなため、プログラミングを始めたばかりの方でも学習しやすい言語です。実際に筆者が講師を務める大学の講義においても初めての言語としてGoを学習する学生も多いですし、筆者が行っているGopher道場においても1000名以上の方が入門しています。

前述のとおり、国内外および開発規模に関わらず多くの開発現場でGoが活用されています。言語のシンプルさからくる、学習のしやすさやコードの読みやすさなども企業による採用が進んでいる理由だと筆者には考えています。また、Goは開発者が安心して利用できるように後方互換性を強く意識して開発されています。そのためGoは、学習しやすく、学んだことが活かせる場の多い、知識が陳腐化しにくい言語であると言えます。

開発環境の準備

開発環境の準備は簡単です。Goのコンパイラや開発ツール、標準パッケージなどが入ったツールチェインをインストールするところから始まります。ツールチェインは、Goの公式サイトからインストーラをダウンロードしてインストールできます。macOSの場合には、brew install goでもインストール可能です。もちろん、OSSで公開されていますので、ソースコードからのコンパイルも可能です。

新しく言語の学習を始める場合、◯◯envと呼ばれるツールを探したくなりますが、Goはバージョンごとに開発環境を分離する必要がほとんどありません。後方互換性も維持しているため、バージョンアップも気軽に行えます。どうしてもGoのバージョンごとに開発環境を構築したい場合は、サードパーティ製のツールを用いるのではなく、公式で提供されている複数バージョンを共存する方法を利用すると良いでしょう。

※参考 : https://golang.org/doc/manage-install

ツールチェインにはエディタや統合開発環境(IDE)は付属していません。しかし、エディタやIDEのプラグインからツールチェインに含まれている開発ツールや準標準なツールを呼び出すように作られていることが多く、どのエディタやIDEを選んでも大きな差はなく開発できます。そのため、開発者は自分の好きなエディタやIDEを選択でき、開発チームで統一する必要もありません。

GoogleのGoチームの調査によると、MicrosoftのVisual Studio CodeやJetBrainsのGoLand(IntelliJ IDEAのGoプラグインも同様)を利用する開発者が多いようです。なお、Visual Studio CodeのGoプラグインは、Goの公式プロジェクトとしてサポートされています。

基本的な文法

Goの制御構文にはif文、for文、switch文などがあります。これらは公式チュートリアルである A Tour of Goを一通り行うと学習できるでしょう。A Tour of Goはブラウザ上で動かせるチュートリアルとして良くできていますが、練習問題がやや難しいため、静岡県のGoコミュニティであるShizuoka.goの有志が公開している解説動画を参考にすると良いでしょう。

また、ブラウザ上でgoコマンド(ビルドやテストなどを行うコマンド)が実行できるPlay With GoやMicrosoftが提供しているGoの最初の手順も良い学習教材です。

書籍であれば『プログラミング言語Go』を読んでおけば基礎的な文法はしっかり学べます。また、筆者が公開しているプログラミング言語Go完全入門の第2章〜第3章でも扱っています。

他の言語をすでに学んでいる方は、Goの学習は非常にスムーズに行えるでしょう。むしろGoには機能が少なく退屈な言語に感じるかもしれません。『なぜGoには○○という機能がないのだろう?』と感じた場合には、公式で用意されているFAQを確認すると良いでしょう。Goはシンプルさを大切にしているため、安易に機能を増やすべきではないという、Googleの慎重さと思慮深さを知れます。

モジュール

GoにはGo Modulesと呼ばれるモジュール管理の機能があります。Go 1.0がリリースされた当初は依存するパッケージを管理する機能はありませんでした。Go 1.5でベンダリングの機能が導入され、その後GlideやGBなどのサードパーティ製のパッケージ管理ツールがいくつか開発されました。そして、コミュニティで統一化されたツールの需要が高まり、depが開発されました。depはGoのツールチェインに採用されることはありませんでしたが、その後登場したGo Modulesが公式のモジュール管理(パッケージ管理)ツールになりました。

Go Modulesが登場したのはGo 1.11であるため、GOPATHを使った方法、GlideやGBなどのサードパーティ製のツールを使った方法、depを使った方法などがWeb上に散らばっています。これからGoを始める方は、それらの情報は気にすることなくGo Modulesを用いた開発方法を学べばよいでしょう。

Tutorial: Create a Go moduleとGo Modulesを使った開発について解説した公式のドキュメントです。モジュールの作り方を簡単に解説しています。さらに詳しい開発方法について知りたい場合は、公式ドキュメントのDeveloping modulesや公式ブログのUsing Go Modulesという記事を読むと良いでしょう。

Go Modulesではgo modコマンドを使用します。go modコマンドの詳しい情報はgo help modコマンドや公式のGo Modules Referenceで確認できます。この他、Go Modulesの情報はGo Wikiにまとまっています。

Play With GoのGo fundamentalsではGo Modulesを使った開発についてブラウザ上で学べます。また、プログラミン言語Go完全入門の第4章でもGo Modulesについて扱っています。

モジュール内のディレクトリやパッケージ構成はGoエンジニアの共通の悩みの種です。Web上にはさまざまなベストプラクティスが転がっていますが、公式では用意されていません。ベストプラクティスはあくまでその開発現場、メンバーにおけるものです。それらは参考にはなっても自身のベストプラクティスになることはあまり多くないでしょう。フラットにするのか、レイヤー構造にするのかなどは開発対象のドメインや開発メンバーなどによって変わってきます。Web上の情報を鵜呑みにせずに自分たちで模索していくことが一番です。

抽象化やテスト

Goはインタフェースによって抽象化を行います。インタフェースについては、A Tour of Goや書籍『プログラミン言語Go』、プログラミン言語Go完全入門の第6章などで学べます。過度の抽象化は避けるべきですが、うまく抽象化してあるとテストしやすくなります。

Goにはgo testとよばれるテストランナーが標準で提供されています。標準ライブラリのtestingパッケージを用いてテスト関数を書くことでテストコードを書いていきます。公式のFAQにあるようにGoにはアサーションの機能はありません。またtestingパッケージは他の言語のテスティングフレームワークと比べて貧弱に見えるかもしれません。大きなテスティングフレームワークを提供してしまうと、テスト用のミニ言語と思えるような記法をする必要が出てくるかもしれません。これは初学者や新しいプロジェクトメンバーの学習コストの増加に繋がります。テスティングフレームワークについても公式のFAQに記載があります。

go testコマンドについてはgo toolのリファレンスにあるTest packagesTesting flagsを読むと良いでしょう。テスト関数についてはTesting functionsに記載があります。testingパッケージについてはパッケージドキュメントを確認しましょう。

筆者が公開しているGoハンズオン - テストを書こうではGoにおけるテストの基礎から応用までを扱っています。ハンズオン形式の資料であるため、手を動かしながら学ぶことができます。筆者も共著している書籍『改訂2版 みんなのGo言語』では、第6章でテストについて扱っています。単体テストだけではなく、ベンチマークについても触れています。

GopherConで行われたMitchell Hashimoto氏のAdvanced Testing with Goというセッションではテーブル駆動テストやゴールデンファイルを用いた実践的なテスト手法について紹介されています。

並行処理

Goはゴールーチンとチャネルによって並行処理を言語レベルでサポートしています。書籍『プログラミング言語Go』では第8章で扱っています。並行処理だけでも非常に大きなトピックなため書籍『Go言語による並行処理』を読んで理解を深めるのも良いでしょう。プログラミング言語Go完全入門では第9章で扱っています。

Rob Pike氏のGo Concurrency Patternsや公式ブログのGo Concurrency Patterns: Pipelines and cancellationも勉強になります。Codewalk: Share Memory By Communicatingではゴールーチンとチャネルの使い方をコードを見ながら解説しています。

並行処理ではデータ競合に悩まされることが多いでしょう。Goではgo buildコマンドやgo testコマンドに-raceオプションを指定するとRace Detectorと呼ばれるデータ競合を発見するツールがプログラム実行中に動作します。使い方は公式ドキュメントのData Race Detectorや公式ブログのIntroducing the Go Race Detectorという記事が参考になります。公式ドキュメントのThe Go Memory Modelもあわせて読んでおくとなぜデータ競合が発生するのか理解が深まるでしょう。

Goでは並行処理に関連するパッケージとしてsyncパッケージを標準で用意しています。ここにはロックやスレッドセーフなマップなどが含まれています。また、golang.org/x/syncパッケージにおいても並行処理に便利な機能が提供されています。

並行処理において処理のキャンセルは実装の難しい機能の1つです。ゴールーチンはキャンセル処理(終了処理)を正しく行わないとリークします。ゴールーチンリークはメモリリークにつながり、プログラムが異常終了してしまう恐れがあります。Go 1.7から導入されたコンテキストは複数のゴールーチンに対して処理の中止を伝えます。中止を伝えられたゴールーチンは正しく終了できるためリークを防げます。コンテキストは標準ライブラリのcontextパッケージで提供されています。コンテキストについては公式ブログのGo Concurrency Patterns: ContextContexts and structsという記事が参考になります。

公式ドキュメントで学ぶ

本記事で紹介した文献の多くは公式ドキュメントです。公式サイトであるgolang.orgには非常に多くのドキュメントが提供されています。また、公式ブログでは古い記事も含め非常に勉強になるものばかりです。GoogleのGoチームはコミュニティ主催のカンファレンスでも数多く発表しています。発表資料はtalks.golang.orgにまとめられています。

2019年に公開されたgo.devでは企業によるケーススタディやユースケースなども紹介されています。

標準パッケージについては、パッケージドキュメントを確認すると良いでしょう。関数や型の解説や使い方が記載されています。サードパッケージパッケージについてはpkg.go.devから検索できます。

go tool(goコマンド)は非常に多くの機能を持っています。一度はCommand Documentationを眺めてみることをおすすめします。また、DiagnosticsではGoで標準で提供されているプロファイルやトレーシングを行う機能について解説しています。

筆者は新しいプログラミン言語を学ぶ上でその言語の文化も一緒に学ぶことが大切だと考えています。Go at Googleで誕生した背景を知り、FAQEffective GoGo Code Review Commentsなどから文化を知ると良いでしょう。

Goをより深く理解したい場合は言語仕様を読むと良いでしょう。言語仕様というと非常に膨大な量のドキュメントだと思われがちですがそんなことはありません。A Tour of Goだけでは学べない細かな仕様を文法とともに学べます。

Goはまだまだ日本語の情報が豊富という状況ではないかもしれません。しかし、自動翻訳システムの助けを借りながら公式ドキュメントや公式ブログを読むだけでも多くの知識が得られます。また、公式の情報は間違った解釈が入りにくくなっています。日本語のブログ記事を読む際のリファレンスとして使うとより理解が深められます。コミュニティでは公式ドキュメントの読書会も開催されていますので参加するのも良いでしょう。

コミュニティと共に学ぶ

世界各地にGoのコミュニティが存在します。日本においても沖縄から北海道までGoコミュニティが存在し、勉強会やカンファレンスを行っています。Gophers Slackでは世界各地のGoエンジニアとやりとりができます。もちろん、#japanチャンネルでは日本語でやりとりができるため、気軽に参加すると良いでしょう。

女性とジェンダーマイノリティ向けのGoコミュニティであるWomen Who Go Tokyoや初学者向けのGoビギナーズなど、さまざまなバックグラウンドを持つ人達が安心して参加できるコミュニティがあります。自分にあったコミュニティを見つけて他の人と一緒に学ぶのも良いでしょう。

筆者もプログラミング言語Go完全入門Gopher道場 自習室Goハンズオンなどをコミュニティ活動の一環として公開しています。ぜひ、活用してください。

最後に

簡単4ステップ!スキルや経験年数をポチポチ選ぶだけで、あなたのフリーランスとしての単価相場を算出します!

※相場算出に個人情報の取得はおこないません。

Go言語案件を提案してもらう

  • このエントリーをはてなブックマークに追加

関連案件

もっとGo言語の案件を見る

プライバシーマーク

© 2017-2023 Levtech Co., Ltd.

フリーランスの案件探しを
エージェントがサポート!

簡単60秒無料サポート登録

  1. Step1
  2. Step2
  3. Step3
  4. Step4
  5. Step5

ご希望のサポートをお選びください。