トップ OSS紹介 Go言語(Golang)

Go言語(Golang)

NRIのOpenStandiaが提供するGo詳細情報

バージョンアップ情報

Go言語(Golang)情報

Go言語(Golang)情報更新日:2026/06/09

Goとは

Goは2009年にGoogle社からオープンソースとして発表されたプログラミング言語で、一般的にはGo言語やGolangと呼ばれています。
既存の静的型付けプログラミング言語の利点(安全性、実行性能など)と、動的型付けプログラミング言語の利点(開発のしやすさ)を併せ持つ比較的新しいプログラミング言語です。

2009年以前、Google社においてサーバを実装するプログラムは静的型付け言語であるC++、Javaが主流でした。
これらの言語は、効率的なコンパイル、効率的な実行、プログラムの容易さの3つすべてを満たすものではありませんでした。
また、安全性や効率性よりもプログラムの容易さを選ぶプログラマーは、動的型付けのインタプリタ言語(Python、JavaScriptなど)を選んでいました。
このような背景から、双方のプログラミング言語の長所を生かした新しいプログラミング言語が求められるようになり、Goという新しい言語の開発が始まりました。

Goの主な設計方針は、「可能な限り効率的で、安全で、流暢なプログラミング言語にする」ことです。
Goでは、コード上の無駄な記述や複雑性の削減が積極的に行われています。
例えばC言語のような前方宣言やヘッダファイルは必要なく、宣言は1度きりです。
また、単純化のためC++ やJavaのような型階層や例外処理、アサーション、関数・演算子オーバーロードがありません。

新しい言語ですが、既に多くの企業で利用されています。
特に、仮想コンテナのDockerや、コンテナオーケストレーションシステムのKubernetesは Go で実装されており、十分な稼働実績があります。

主な特徴

Goの主な特徴は、シンプルさと実用性を重視し、次の点にあります。

  • 並行処理を標準で扱える(goroutineとchannel)
  • コンパイル言語としての実行性能と配布のしやすさ
  • 実用的で一貫したツールチェーン

具体的には以下の点が挙げられます。

  • 組み込みの軽量並行モデルにより、複数の並行処理を低コストに扱えること。
  • コンパイル言語でありながらコンパイルが非常に速く、単一の自己完結型バイナリを生成でき、デプロイや配布が容易であること。
  • 実用的な標準ライブラリ(特にネットワークやHTTPまわり)が充実しており、インフラ/ネットワーク系の開発生産性が高いこと。
  • ランタイムに組み込まれたガベージコレクションと、並行収集による短い停止時間により、メモリ管理と応答性のバランスが取れていること。
  • 明確で一貫したツール群(go fmt、 go build、 go test、 go vet、 go mod 等)により、コード品質やビルド・テストの標準化が容易であること。

項目

Go

Java

C/C++

Python

型システム

静的型付け

静的型付け

静的型付け

動的型付け

実行モデル

ネイティブ実行

JVM上で実行

ネイティブ実行

VM/インタプリタ

並行性

軽量並行処理(goroutine+channel)

スレッド並行処理

低レベル並行処理

GIL制約付き並行処理

ビルド/配布

単一バイナリ生成として配布可能

JAR形式、実行にはJVM/JREが必要

ネイティブバイナリとして配布可能

スクリプトと依存ライブラリを配布可能

処理速度

非常に高

低〜中

学習コスト

低〜中

適用領域

サーバ、CLI、インフラ、ネットワーク

エンタープライズ、バックエンド

OS開発、組込み、高性能処理

スクリプト、データ、プロトタイピング、AI開発

上記の特徴から、GoはKubernetesやDockerといったインフラ寄りのプロダクトの開発に活用されています。

他にも、Goには以下の特徴があります。

フォーマッタ

  • ソースコードのインデントやスペースなどを自動的に標準スタイルに整形するフォーマッタコマンドgo fmtとgofmtがソースコードの品質を高めます。
    • go fmt: パッケージ内のソースコードのフォーマットをまとめて整形します。
    • gofmt: go fmtと同等の機能に加え、対象ファイル一覧やエラー内容の表示などの細かい指定が可能です。

ドキュメントの生成・表示

  • ソースコード上のコメントからドキュメントを生成して表示するコマンドgo docとgodocが仕様把握を容易にします。
    • go doc: ライブラリやプロジェクトのパッケージ、関数、変数のドキュメントをコンソール上にすばやく表示できます。
    • godoc: 別途インストールして利用するツールで、HTML形式に生成されたドキュメントをブラウザで参照することも可能です。

命名規則

  • パッケージ外から参照される変数/関数のネーミングは先頭文字を大文字にするのがルールです。このルールによってアクセス制御が行われるため、アクセス修飾子(private、publicなど)がありません。また、ゲッター/セッターは自動サポートされません。

セミコロン

  • 文の終了のセミコロンは不要です。

制御機構

  • := により、型の指定なく変数を宣言できます。
  • if や、for の条件式に () を必要としません。
  • do-while や、while ループがありません。すべて for で記載します。
  • switch の各 case 文でbreak の必要がありません。自動的にbreak が行われます。(明示的にfallthroughを使用し次のcase文を実行する事も可能)
  • チャネル変数を使った実行制御ではselect { case ... } を利用します。

関数

  • 複数の戻り値に対応しています。
  • defer 文により、関数の終了後に処理を実行させることが可能です。ミューテックスのロック解除や、ファイルのクローズなどに利用されます。

ゼロ値とメモリ割り当て

  • 変数が宣言され初期化されていない状態の値をゼロ値といいます。
  • ポインタ、マップ、スライス、関数、チャネル、インターフェースなどのゼロ値はnilといいます。
  • メモリ割り当ては、new関数、もしくはmake関数によって行われます。
    • new関数: 型のメモリを確保し、ゼロ値にしてポインタを返します。
    • make関数: 配列のスライスやマップ、チャネルを初期化する場合のみに使われます。
  • ゼロ値だけでは利用できない型は、型のポインタを返すNew{型名}関数により初期化します。Goは仕様としてのコンストラクタはありませんが、習慣的にNew{型名}という名前の関数を使用してコンストラクタのような役割をさせます。
  • fmtパッケージを利用することで、型に応じて様々なフォーマットで出力することが可能です。

初期化

  • 通常の定数、変数の定義に加え、init 関数が利用できます。init 関数を使うことで、プログラムが実行される前に、パッケージ変数の妥当性を検証することが可能です。

メソッド

  • クラスの仕組みはありませんが、任意の型にメソッド(レシーバ引数を伴う関数)が定義できます。
  • メソッドにポインタレシーバ引数を利用することで、レシーバ内の変数の変更やメモリの節約ができます。

インターフェース

  • 他の言語と同様、複数のインターフェースを実装できます。ただし、C++や、Javaのように実装しているインターフェースを明示する必要はなく、必要なメソッドを実装していれば満たす(暗黙的実装)という特徴があります。
  • 空のインターフェースで定義した変数には任意の型の代入ができます。変数の型を判別する処理(型アサーション)などで利用されます。
  • 引数や戻り値にインターフェース型を指定して、特定の型に依存しない処理を実現することが可能です。

ブランク識別子

  • 複数の戻り値があるが一部しか使用しない場合(rangeによるループやインターフェースチェックなど)や、未使用の変数があるが開発中はデバッグとして残しておきたい場合などに、"_"(ブランク識別子)を利用できます。

埋め込み

  • Goにはクラスの継承関係はありませんが、構造体変数に別の構造体や複数のインターフェースを埋め込むことで、複数のインターフェースを持つ型を簡単に定義でき、埋め込んだ変数に処理を委譲することができます。

並行処理

  • goroutine(Goルーチン)を利用することで、関数を簡単に並行実行させることができます。
    go func() { ... }() と記述するだけです。
  • チャネル型変数を利用することで、goroutine 間でデータを共有したり、非同期実行された処理の完了を待ったり、セマフォとして利用したりすることができます。

エラー制御

  • 関数で複数の戻り値を返すことが可能なので、単純なエラー値でなく、エラーに応じた詳細なコンテキストを返すことができます(Goでは、error インターフェースを実装することを推奨)。
  • panic 関数により意図的にエラーを発生させた場合recover 関数によりpanicによるエラーから処理を復帰させることができます。

メリット・デメリット

メリット・必要性

1.豊富な利用実績

Docker や Kubernetes などの多くの製品が開発されています。

2.高速な処理性能とコンパイル

高速なコンパイルと出力されたネイティブコード実行により高速で動作できます。

3.並行処理に強い

goroutineにより、多くの並行処理を簡単に効率的に実行できます。

4.シンプルで読みやすい文法

シンプルな言語仕様のため可読性が高く、大人数での開発やメンテナンスが容易です。

5.多くのプラットフォームに対応

Linux、Windows、macOSなどの多くのプラットフォームでのコンパイルと実行が可能です。

6.豊富な標準ライブラリとツール

HTTPサーバやJSON操作などのWeb開発のための便利なライブラリや、フォーマッタ(go fmt)やテストツールが同梱されています。

7.安全性が高い

GC(ガベージコレクション)や型安全性が、メモリリークのリスクを低減します。

デメリット・注意点・課題

1.try/catchがない

try/catch構文はなく、errorインターフェースによる明示的なエラーハンドリングが必要で、コードが冗長になりやすい場合があります。

2.完全なオブジェクト指向言語とは言えない

オブジェクト指向的なプログラミングが可能ですがクラスや継承の概念がなく、構造体の埋め込みとインターフェースで代替する設計のためコードの再利用がやや煩雑になります。

3.型システムの表現力

sum type(直和型)やパターンマッチングが言語仕様として提供されないため、いくつかのデータモデリングが冗長になることがあります。

4.ランタイムのオーバーヘッド

GC(ガベージコレクション)による一時停止が発生するため、極度の低レイテンシが求められるリアルタイムシステムには不向きな場合があります。

5.GUI開発向けの機能は限定的

標準ライブラリにはデスクトップGUIアプリケーション向けの物は含まれていないため、別途FyneやGioなどのGUIフレームワークが必要です。

ユースケース

Goは以下のような用途で使用されています。

  • クラウドおよびネットワークサービス
  • コマンドラインインタフェース(CLI)
  • ウェブ開発
  • 開発オペレーション(DevOps)およびサイト信頼性エンジニアリング(SRE)

Goで開発されたプロダクト

Goで開発されたOSSには以下のようなものがあります。

新たな機能・取り組み

Goは2026年5月現在でも積極的に開発されており、以下のような新しい機能が追加されています。

Green Tea GC

Green Tea GC(ガベージコレクション)は、新たに導入されたGCです。
従来のGCではオブジェクト単位でポインタ探索を行っていましたが、Green Tea GCでは、ページ(連続したメモリブロック)毎にスキャンする効率的な方式に変更され10%~40%高速になっています。
Green Tea GCはGo 1.25 で実験的に導入され、Go 1.26ではデフォルトで有効になっています。

ポスト量子暗号(PQC)

Goでは、将来登場することが想定される量子コンピュータによる解読にも耐えられる次世代耐暗号技術PQC(Post-Quantum Cryptography)への対応が進められています。

Go 1.24 で、X25519MLKEM768鍵交換メカニズムがサポートされ、デフォルトで有効になっており、crypto/mlkem パッケージは、ML-KEM-768 および ML-KEM-1024 の実装が含まれています。

動作環境

公式サイトで提供されているバイナリは、以下OS/アーキテクチャで利用可能です。これ以外の OS やアーキテクチャで利用する場合は、ソースからのインストールが必要になります。

OS

アーキテクチャ

Linux

  • x86
  • x86-64
  • ARM64
  • ARMv6

macOS

  • x86-64
  • ARM64

Windows 10 以降

  • x86
  • x86-64

参考: https://go.dev/dl/

Goのライセンス

Goは、BSD 3-Clause License(修正BSDライセンス)の元で配布されています。
ソースおよびバイナリ形式での再配布・改変が許可されており、再配布時には著作権表示、ライセンス条項、免責条項の保持が求められます。

製品ダウンロード

参考情報

オープンソース年間サポートサービス

OpenStandiaではOSSを安心してご利用いただけるように、オープンソース年間サポートサービスをご提供しております。
サポートしているOSSは下記ページをご参照ください。

お気軽にお問い合わせください

関連OSS

  • Ruby on Rails

    Ruby on Rails

    ルビーオンレイルズ。Rubyで書かれているオープンソースのWebアプリケーション開発フレームワークです。

  • Java

    Java

    ジャバ。サンマイクロシステムズ社(2010年にオラクル社に吸収合併)により開発されたプログラミング言語、及びその動作環境である Java VM(ジャバ仮想マシン) です。

オープンソースに関するさまざまな課題、OpenStandiaがまるごと解決します。
下記コンテンツも
あわせてご確認ください。