Go
Goは、Googleが開発したオープンソースの汎用プログラミング言語であり、特にバックエンドサービスやネットワークプログラミングを主な目的として設計されています[1]。
静的型付け言語であるため、高速で効率的なプログラムを作成することができます。また、並行処理を簡単に実装できるgoroutineという仕組みを持ち、高い並行性を実現しています。
Goの文法はシンプルで読みやすく、効率的にコーディングできるため、開発者は迅速に新しいコードを書くことができます。ガベージコレクションによって自動的にメモリを管理するため、メモリ管理に関する手間を減らすことができます。
さらに、Windows、macOS、Linuxなど、多くのプラットフォームで動作し、標準ライブラリが豊富です。多くの外部ライブラリも存在するため、広範な用途に対応することができます。 Goのコミュニティは活発であり、多くの開発者が参加しています。質問や問題解決のためのリソースが豊富であり、新しい機能やライブラリが定期的にリリースされています。
この教科書では、初めてGoを学ぶ人から、より高度なトピックに興味のある人まで、幅広い読者を対象に、Goの基本から応用までを網羅的に解説します。
目次
[編集]- チュートリアル篇
- 環境構築
- 実行の方法 — Hello, World
- 文法の概要
- 変数と型変換
- 算術演算と数学関数
- 条件分岐と繰り返し — if, switch, select, for, break, continue, return
- 関数
- メソッドとインターフェース
- ジェネリクス
- 再帰的関数呼出し
- メソッドチェイン
- defer, panicとrecover
- 並行処理
- 配列型とスライス型
- マップ型
- 構造体型と構造体スライス
- イテレータ
- Goのプログラムがどんなアセンブリにコンパイルされるか? — go tool objdump
- クロスコンパイル — GOOS, GOARCH
- cgoでGoのコードからCの関数を利用する — cgo
- Goのコードでgoのバージョンを調べる方法
- HTTP
- ファイル入出力
- コードギャラリー
- リファレンス篇
- ソースコードの表現方法
- キーワードと宣言済み識別子 — キーワード・宣言済み識別子(組込み型・組込み関数)
- 字句的要素
- 定数と変数 — 定数(iota)・変数
- 型
- 型と値の特性
- ブロック・宣言とスコープ — ブロック・宣言とスコープ
- 式 — 演算子
- 文
- パッケージ
- プログラムの初期化と実行
- エラー
- EBNF
- 標準ライブラリー篇
- 改廃された技術
バージョン間の変更点
[編集]Go は、約半年ごとに新しいバージョンがリリースされます。バージョンが変わると、言語仕様に追加変更があったり、ツールチェーン、ランタイム、およびライブラリの実装に変更が加えられることがあり、稀に既存のプログラムに影響が出ることもあります。以下に、最新のバージョンから順に変更点を記載します。
Go 1.26
[編集]Go 1.26が、2026年2月にリリースされました[2][3]。 Go 1.26のリリースでは、言語仕様への便利な糖衣構文の追加、ツールチェーンの大幅な刷新、および新しい暗号化標準のサポートが含まれています。最も注目すべき変更点は以下です。
- 言語の変更点:
-
new関数の拡張:組み込みのnew関数が、引数として初期値を指定する式を受け取れるようになりました。例えばptr := new(int64(300))のように、1行で初期値付きのポインタを作成可能です。- 自己参照的なジェネリック型:型パラメータリスト内で、その型自体を参照することが可能になりました。これにより、複雑なデータ構造やインターフェースの柔軟な実装が可能になっています。
- 新しい標準パッケージ:
-
- crypto/hpke:RFC 9180 で定義されている Hybrid Public Key Encryption (HPKE) をサポート。
- testing/cryptotest:暗号化実装の適合性を検証するための共通テストスイートを提供。
- crypto/mlkem/mlkemtest:ML-KEM 実装のテスト用パッケージ。
- 実験的新機能:
-
- simd/archsimd:SIMD(Single Instruction Multiple Data)命令へのアクセスを抽象化する実験的パッケージ。
- ランタイムとパフォーマンスの改善:
-
- Green Tea GC のデフォルト有効化:Go 1.25で実験的だった「Green Tea」ガベージコレクタがデフォルトで有効になりました。
- cgo オーバーヘッドの削減:cgo 呼び出しのベースライン・オーバーヘッドが約 30% 削減されました。
- スタック割り当ての最適化:スライスのバッキングストアがスタックに割り当てられる条件が緩和され、メモリアロケーションの効率が向上しました。
- ツールの改善:
-
- go fix の完全刷新:Go analysis フレームワークを使用して書き直されました。新しい「modernizers」機能により、古いコードを最新の言語仕様やライブラリ機能に適合させる修正案(数ダースの種類)が自動提示されます。
- //go:fix inline ディレクティブ:このディレクティブが付与された関数への呼び出しを、go fix が自動的にインライン展開する機能が追加されました。
- 標準ライブラリの改善:
-
- crypto/tls:TLS 1.3 における X25519MLKEM768 鍵交換(ポスト量子暗号)がデフォルトで有効化。
- math/rand/v2:PCG および ChaCha8 アルゴリズムによる乱数生成の安定性と速度が向上。
- プラットフォームサポートの変更:
-
- macOS:macOS 12 Monterey をサポートする最後のバージョンとなりました。次期 Go 1.27 では macOS 13 Ventura 以降が必須となります。
- Windows:予告通り 32-bit ARM (windows/arm) ポートのサポートが削除されました。
Go 1.26では、開発者のコーディング負荷を軽減する言語仕様の改善と、エコシステム全体を最新化(Modernize)するための強力なツール提供に重点が置かれています。
Go 1.25
[編集]Go 1.25が、2025年8月にリリースされました[4][5]。
Go 1.25のリリースでは、実験的機能を含む多くの重要な改良が含まれています。最も注目すべき変更点は以下です。
- 言語の変更点:
-
- 言語仕様上の変更はありませんが、言語仕様書からcore typesの概念が削除され、専用の記述に置き換えられました。これによりより正確で理解しやすい仕様書となっています。
- 新しい標準パッケージ:
-
- testing/synctest:並行コードのテストをサポートするパッケージ。仮想化されたクロック機能により、並行プログラムのテストがより効率的に行えるようになりました。Go 1.24では実験的機能(GOEXPERIMENT=synctest)でしたが、Go 1.25で正式にサポートされました。
- 実験的新機能:
-
- 新しい実験的ガベージコレクター:GOEXPERIMENT=greenteagcで有効化可能。小さなオブジェクトのマークとスキャンのパフォーマンスが大幅に改善され、実世界のプログラムでガベージコレクションのオーバーヘッドが10-40%削減される見込みです。
- encoding/json/v2パッケージ:GOEXPERIMENT=jsonv2で有効化可能。既存のencoding/jsonパッケージの大幅な改良版で、特にデコード性能が大幅に向上しています。
- ランタイムの改善:
-
- コンテナ対応のGOMAXPROCS:LinuxでcgroupのCPU帯域幅制限を考慮し、論理CPU数よりも制限が低い場合はGOMAXPROCSを制限値に設定します。また、全OSでGOMAXPROCSを動的に更新する機能が追加されました。
- トレースフライトレコーダー:runtime/trace.FlightRecorderAPIにより、インメモリリングバッファを使用した軽量な実行トレースキャプチャが可能になりました。
- VMAアノテーション:Linux上でメモリマッピングに目的を示すアノテーション([anon: Go: heap]など)が付加されるようになりました。
- コンパイラの改善:
-
- nilポインターチェックのバグ修正:Go 1.21で導入された、nilポインターチェックが不適切に遅延される問題が修正されました。
- DWARF5サポート:デバッグ情報でDWARF5が使用され、バイナリサイズの削減とリンク時間の短縮を実現しました。
- スライスの高速化:より多くの状況でスライスのバッキングストアをスタックに割り当てることが可能になり、パフォーマンスが向上しました。
- ツールの改善:
-
- go buildのLeakDetection:-asanオプションでプログラム終了時にメモリリーク検出がデフォルトで有効になりました。
- go.modのignoreディレクティブ:go commandが無視すべきディレクトリを指定できるようになりました。
- go docの-httpオプション:ドキュメントサーバーを起動しブラウザで表示する機能が追加されました。
- go version -m -json:バイナリファイルの BuildInfo構造体をJSON形式で出力できるようになりました。
- 新しいvetアナライザー:waitgroup(WaitGroup.Addの誤用を検出)、hostport(IPv6で動作しないアドレス構築パターンを検出)が追加されました。
- 標準ライブラリの改善:
-
- crypto系パッケージでMessageSignerインターフェースが追加され、メッセージ自身をハッシュ化するサイナーをサポート。
- crypto/sha1でSHA-NIインストラクションによる2倍の高速化。
- crypto/sha3でApple Mプロセッサーでの2倍の高速化とCloner実装。
- crypto/tlsでConnectionState.CurveIDフィールドとGetEncryptedClientHelloKeysコールバックを追加。
- net/httpでCrossOriginProtectionによるCSRF保護機能が追加。
- os/WindowsでのNewFileがFILEFLAGOVERLAPPEDハンドルに対応し、非同期I/Oをサポート。
- sync.WaitGroup.Goメソッドによりgoroutineの作成とカウントパターンが簡便化。
- testing系パッケージでT.Attr、B.Attr、F.Attrメソッドによるテスト属性出力をサポート。
- セキュリティの改善:
-
- FIPS 140-3モードでの改善:crypto/ecdsaとcrypto/ed25519での署名処理が4倍高速化。
- TLS 1.2でSHA-1署名アルゴリズムがデフォルトで無効化(RFC 9155準拠)。
- crypto/x509でCreateCertificateがSHA-256を使用したSubjectKeyId生成を使用。
- プラットフォームサポートの変更:
-
- macOS:macOS 12 Monterey以降が必要になりました(Go 1.24の予告通り)。
- Windows:32-bit ARM(windows/arm)ポートはGo 1.25が最後のサポートバージョンとなり、Go 1.26で削除予定です。
- linux/loong64:レースディテクターとCgoトレースバック、内部リンクモードでのcgoプログラムリンクに対応。
- linux/riscv64:pluginビルドモードに対応。GORISCV64環境変数でrva23u64値をサポート。
Go 1.25では、パフォーマンス、セキュリティ、開発者体験の向上に重点が置かれ、特に実験的機能として提供される新しいガベージコレクターやJSON実装により、将来的なさらなるパフォーマンス向上の基盤が築かれています。
Go 1.24
[編集]Go 1.24が、2025年2月にリリースされました[6][7]。
Go 1.24のリリースでは、いくつかの重要な新機能と改善が含まれています。最も注目すべき変更点は以下です。
- 言語の変更点:
-
- ジェネリック型エイリアスが完全にサポートされるようになりました。これにより、型エイリアスに型パラメータを設定できるようになり、既存の型を制約付きで再定義することが可能になりました。たとえば
type VectorAlias[T any] = Vector[T]のような定義ができます。この機能は Go 1.23 では実験的な機能(GOEXPERIMENT=aliastypeparams)でしたが、Go 1.24で正式にサポートされました。
- ジェネリック型エイリアスが完全にサポートされるようになりました。これにより、型エイリアスに型パラメータを設定できるようになり、既存の型を制約付きで再定義することが可能になりました。たとえば
- 新しい標準パッケージ:
-
- crypto/mlkem:ML-KEM-768とML-KEM-1024を実装したパッケージ。
- crypto/hkdf:HMAC-based Extract-and-Expand key derivation function (HKDF) を実装したパッケージ。
- crypto/pbkdf2:password-based key derivation function (PBKDF2) を実装したパッケージ。
- crypto/sha3:SHA-3ハッシュ関数とSHAKE/cSHAKE extendable-output functionsを実装したパッケージ。
- weak:弱参照を提供するパッケージ。
- testing/synctest:並行コードのテストをサポートする実験的なパッケージ(GOEXPERIMENT=synctestが必要)。
- パフォーマンスの改善点:
-
- Swiss Tablesベースの新しいマップ実装により、2-3%のCPUオーバーヘッドが削減。
- 小さなオブジェクトのメモリ割り当ての効率化。
- 新しいランタイム内部ミューテックス実装。
- ツールの改善:
-
- go.modファイルでツール依存関係を追跡できるようになりました。
- go buildとgo installに -json フラグが追加され、構造化されたJSON出力が可能に。
- go vetに新しいtestsアナライザーが追加され、テストの一般的な間違いを検出可能に。
- セキュリティの改善:
-
- FIPS 140-3コンプライアンスのための新しいメカニズムが追加。
- TLSサーバーがEncrypted Client Hello (ECH)をサポート。
- RSAキーは1024ビット未満のキーサイズでエラーを返すように変更。
- プラットフォームサポートの変更:
-
- Linuxはカーネルバージョン3.2以降が必要になりました。
- Go 1.24はmacOS 11 Big Surをサポートする最後のバージョンとなります。
- Windows 32-bit ARM (windows/arm)は「broken」とマークされました。
また、1.23でサポートされた"for-range"ループのイテレータ機能を活用し、bytes/stringsパッケージに新しいイテレータ関数(Lines、SplitSeq、SplitAfterSeq、FieldsSeq、FieldsFuncSeq)が追加されました。os.Root型による特定ディレクトリ内でのファイルシステム操作が可能になり、testing.B.Loopメソッドにより、ベンチマークの記述がより簡単で安全になっています。
Go 1.23
[編集]Go 1.23が、2024年8月にリリースされました[8][9]。 Go 1.23のリリースでは、いくつかの重要な新機能と改善が含まれています。最も注目すべき変更点は以下です。
- 言語の変更点:
-
- "for-range" ループでイテレータ関数がサポートされるようになりました。これにより、カスタムイテレーション値を生成する関数を使用できます。
- ジェネリック型エイリアスのプレビューサポートが追加されました(GOEXPERIMENT=aliastypeparamsを有効にする必要があります)。
- 新しい標準パッケージ:
-
- uniqueパッケージ:値の正規化(インターン化やハッシュコンス化)を行うための機能を提供します。
- iterパッケージ:ユーザー定義のイテレータ機能を提供します。
- structsパッケージ:構造体のメモリレイアウトなどのプロパティを制御する機能を提供します。
- パフォーマンスの改善点:
-
- Profile Guided Optimization (PGO)のビルドオーバーヘッドが大幅に削減されました。以前は100%以上の増加が見られましたが、今回のリリースでは一桁台のパーセンテージまで改善されています。
- コンパイラがローカル変数のスタックフレームスロットを最適化し、関数内の異なる領域で重複して使用できるようになり、スタック使用量が削減されました。
- テレメトリーと開発者ツール:
-
- Goツールチェーンが使用状況と問題点の統計情報を収集できるテレメトリー機能が追加されました(オプトイン方式)。
- go vetコマンドにstdversionアナライザーが追加され、使用しているGoバージョンと互換性のないシンボルの参照を検出できるようになりました。
- プラットフォームサポートの変更:
-
- macOSは11 (Big Sur)以降が必要になりました。
- Linux kernelは2.6.32以降が必要です(Go 1.24では3.2以降になる予定)。
- OpenBSDの64-bit RISC-Vサポートが試験的に追加されました。
また、time.TimerとTime.Tickerの実装が大幅に改善され、未使用のタイマーがガベージコレクションの対象となるようになりました。セキュリティ面では、TLSクライアントがEncrypted Client Helloをサポートし、3DESの暗号スイートがデフォルトリストから削除されるなどの改善が行われています。
Go 1.22
[編集]Go 1.22が、2024年2月にリリースされました[10][11]。 Go 1.22のリリースでは、いくつかの重要な新機能と改善が含まれています。最も注目すべき変更点は以下です。
- 言語の変更点:
-
- 長らく問題視されてきた「for」ループの変数スコープが変更されました。以前は変数が一度だけ作成され、各イテレーションで更新されていましたが、Go 1.22以降は各イテレーションで新しい変数が作成されるようになり、意図しない共有の問題が解消されました。
- 整数の範囲に対する
rangeのサポートが追加されました。例えば、for i := range 10のような構文が可能になりました。
- パフォーマンスの改善点:
-
- ガベージコレクションのメタデータを各ヒープオブジェクトの近くに配置するように最適化されました。これにより、CPUパフォーマンスが1-3%向上し、ほとんどのGoプログラムのメモリオーバーヘッドが約1%削減されました。
- コンパイラのプロファイル誘導最適化(PGO)が改善され、より多くのインターフェースメソッド呼び出しの仮想化解除が可能になりました。代表的なGoプログラムの多くで、PGOを有効にすることで2-14%のパフォーマンス向上が見られます。
- コンパイラは仮想化解除とインライン化を交互に行うようになり、インターフェースメソッド呼び出しの最適化が向上しました。
- 標準ライブラリの追加と改善:
-
- 標準ライブラリで初めてのv2パッケージとなる
math/rand/v2が追加されました。新しいパッケージでは、ChaCha8とPCGという2つの現代的な疑似乱数生成器を提供し、より高速なアルゴリズムを採用しています。 net/http.ServeMuxのHTTPルーティングがより表現力豊かになりました。メソッドとワイルドカードをサポートし、例えば"POST /items/create"や"/items/{id}"のようなパターンが使用可能になりました。database/sqlパッケージにNull[T]型が追加され、任意の型のnullableカラムをスキャンする機能が提供されます。go/versionパッケージが追加され、Goバージョン文字列の検証と比較機能が提供されます。slicesパッケージに複数のスライスを連結するConcat関数が追加されました。
- 標準ライブラリで初めてのv2パッケージとなる
- ツールの改善:
-
- Goコマンドでワークスペースのvendorディレクトリがサポートされるようになりました。
go work vendorでディレクトリを作成し、-mod=vendorフラグで使用できます。 - トレースツールのWebUIが改良され、スレッド指向のビューでトレースを探索できるようになりました。また、すべてのシステムコールの完全な実行時間が表示されるようになりました。
go vetツールに新しい警告が追加され、appendに値を渡し忘れた場合や、time.Since呼び出しの遅延に関する問題を検出できるようになりました。
- Goコマンドでワークスペースのvendorディレクトリがサポートされるようになりました。
また、macOSのx86-64アーキテクチャ(darwin/amd64)向けのGoツールチェーンが、デフォルトで位置独立実行形式(PIE)を生成するようになりました。Go 1.23以降はmacOS 11 Big Sur以降が必要になることも発表されています。
Go 1.21
[編集]Go 1.21が、2023年8月にリリースされました[12][13]。
Go 1.21では、リリースの番号付けにわずかな変更が導入されました。Go 1.Nは、過去にGo言語のバージョン全体とリリースファミリー、およびそのファミリー内の最初のリリースを指すために使用されていました。しかし、Go 1.21から、最初のリリースはGo 1.N.0となりました。今日、Go 1.21言語とその初期実装であるGo 1.21.0リリースが公開されています。これらのノートは「Go 1.21」と呼ばれますが、go versionなどのツールは「go1.21.0」と報告されます(Go 1.21.1にアップグレードするまで)。
- ツールの改善点:
-
- Profile Guided Optimization(PGO)機能が一般利用可能になりました。
default.pgoという名前のファイルがメインパッケージのディレクトリにある場合、goコマンドはそれを使用してPGOビルドを有効にします。 goツールは今後の言語の後方互換性と前方互換性をサポートします。
- Profile Guided Optimization(PGO)機能が一般利用可能になりました。
- 言語の変更点:
-
- 新しい組み込み関数
min、max、clearが追加されました。 - ジェネリック関数の型推論がいくつか改善され、仕様書の型推論の説明が拡張されました。
- Goプログラミングの最も一般的な落とし穴の1つに取り組む予定で、そのプレビューがGo 1.21に含まれています。これは環境変数を使用してコードで有効にできます。詳細はLoopvarExperiment wikiページを参照してください。
- 新しい組み込み関数
- 標準ライブラリの追加点:
-
- 構造化ログのための新しいlog/slogパッケージが追加されました。
- 任意の要素型のスライスに対する共通操作のための新しいslicesパッケージが追加されました。これには、一般的により高速で使いやすいソート関数も含まれています。
- 任意のキーまたは要素型のマップに対する共通操作のための新しいmapsパッケージが追加されました。
- 順序付けられた値を比較するための新しいユーティリティを提供するcmpパッケージが追加されました。
- 性能の改善点:
-
- PGOを有効にした際のパフォーマンス向上に加えて、以下のような改善があります。
- Goコンパイラ自体がPGOを有効にして再ビルドされ、ホストアーキテクチャによってはプログラムのビルドが2〜4%高速化されました。
- ガベージコレクターの調整により、一部のアプリケーションではテールレイテンシーが最大40%削減される場合があります。
- runtime/traceでトレースを収集する際のCPUコストが、amd64およびarm64で大幅に低減されました。
- 新しいWASIポート:
-
- Go 1.21には、WebAssembly System Interface(WASI)の実験的なポートが追加されました(GOOS=wasip1、GOARCH=wasm)。
- より一般的なWebAssembly(Wasm)コードの記述を容易にするために、コンパイラはWasmホストからの関数のインポートのための新しい指令
go:wasmimportをサポートしています。
Go 1.20
[編集]Go 1.20が、2023年2月にリリースされました[14][15]。
Go 1.20では、スライスから配列への変換が可能になりました。また、unsafeパッケージには新しい関数が追加され、スライスや文字列の値を構築および分解する完全な機能が提供されるようになりました。また、新しい仕様により、構造体のフィールドと配列の要素の比較が最初の不一致で停止するようになり、厳密に比較できない型引数を持つ型パラメータを使用して、比較制約に制限された型をインスタンス化することが可能になりました。
Go 1.19
[編集]Go 1.19が、2022年8月にリリースされました[16][17]。
Go 1.19では、ツールチェーン、ランタイム、およびライブラリの実装に変更が加えられています。言語にはわずかな修正があり、既存のプログラムには影響がないです。メモリモデルも更新され、C、C ++、Java、JavaScript、Rust、Swiftなどのメモリモデルに合わせられた。Go 1.19では、sync/atomicパッケージに新しい型が導入され、atomic.Int64やatomic.Pointer[T]などのatomic値をより簡単に使用できるようになっています。Go 1の互換性を維持しており、ほとんどのGoプログラムは引き続き従前どおりにコンパイルおよび実行されることが予想されます。
Go 1.18
[編集]Go 1.18が、2022年3月にリリースされました[18]。
Go 1.18 には、型パラメータプロポーザル[19]で説明されたジェネリック機能の実装が含まれています。
以下は、最も目に付く変更点のリストです。
- 関数と型宣言の構文に型パラメータが使えるようになりました。⇒ /関数#ジェネリック関数
- パラメータ化された関数や型は、その後に角括弧で型引数のリストを記述することでインスタンス化することができます。
- 新しいトークン
~が演算子および区切子(punctuation)に追加されました。⇒ /字句的要素#演算子と区切子 - インターフェイス型の構文では、任意の型(インターフェイスの型名だけでなく)、unionや~T型要素を埋め込むことができるようになりました。このようなインターフェースは、型制約としてのみ使用することができます。インターフェイスはメソッドと同様に型の集合を定義するようになりました。⇒ /型#インターフェース型
- 新しい事前宣言された識別子
anyは空のインターフェースの別名です。これはinterface{}の代わりに使用することができます。 - 新しい宣言済み識別子
comparableは==や!=を使って比較できる全ての型の集合を表すインターフェースです.
ジェネリックを使った実験的なパッケージが3つあり、便利かもしれません。これらのパッケージは x/exp リポジトリにあります。これらのパッケージの API は Go 1 の保証の対象外であり、ジェネリックの経験を積むにつれて変更される可能性があります。
- golang.org/x/exp/constraints
constraints.Orderedのようなジェネリックコードに便利な制約です。- golang.org/x/exp/slices
- 任意の要素タイプのスライス上で操作するジェネリック関数のコレクションです。
- golang.org/x/exp/maps
- 任意のキーや要素タイプのマップ上で操作するジェネリック関数のコレクションです。
Go 1.18は、言語、ツールチェーン、ランタイム、ライブラリに変更があり、互換性が保たれている。最大の変更点は、ジェネリックスの導入である。ジェネリックスはバックワード互換性があるが、実際に多くの人が書き、使用して初めて本番環境で十分にテストされる。ジェネリックスの使用は推奨されるが、本番環境で使用する場合は注意が必要である。ジェネリックスにはいくつかの制限があるが、これらは将来的に改善される可能性がある。これらの変更により、Goエコシステム全体に影響があり、完全なサポートには時間がかかるだろう。
Go 1.17
[編集]Go 1.17が、2021年8月にリリースされました[20][21]。
Go 1.17は、ツールチェーン、ランタイム、およびライブラリの実装の変更が中心で、ほとんどの変更は互換性が維持されています。言語自体には3つの小さな強化があり、スライスから配列ポインタへの変換、unsafe.Add、unsafe.Sliceが追加されました。このうち、スライスから配列ポインタへの変換が実行時にpanicを引き起こす場合があるため、タイプ変換が実行時にpanicを引き起こす可能性があることを考慮する必要があります。新しいプログラムを書く場合も、以前と同様に、unsafe.Pointerの安全ルールに従う必要があります。
Go 1.16
[編集]Go 1.16が、2021年2月にリリースされました[22][23]。
Go 1.16では、ツールチェーン、ランタイム、ライブラリの実装が変更されています。Go 1の互換性を維持しながら、ほとんどのプログラムが従来通りにコンパイルおよび実行できるようになっています。言語には変更はありません。
Go 1.15
[編集]Go 1.15が、2020年8月にリリースされました[24][25]。
Go 1.15では、リンカーの大幅な改良、高いコア数での小規模オブジェクトの割り当ての改善、X.509 CommonNameの非推奨化、そして新しい埋め込みtzdataパッケージの追加が含まれています。
Go 1.14
[編集]Go 1.14が、2020年2月にリリースされました[26][27]。
Go 1.14では、オーバーラップするインターフェースの提案により、埋め込まれたインターフェースで同じ名前とシグネチャを持つメソッドを許可するようになりました。しかし、インターフェース内で宣言されたメソッドは以前と同様にユニークである必要があります。
Go 1.13
[編集]Go 1.13が、2019年2月にリリースされました[28][29]。
Go 1.13では、数字リテラルの接頭辞が変更され、バイナリ整数、8進数整数、16進数浮動小数点数、虚数リテラル、数字区切りが使用できるようになりました。さらに、符号付きシフトカウントの制限が撤廃され、制限がなくなりました。これらの変更は、コンパイラの変更によって実現されました。Go 1.13を使用するには、go.modファイルで言語バージョンを指定する必要があります。
Go 1.12
[編集]Go 1.12が、2019年2月にリリースされました[30][31]。 Go 1.12のリリースには、いくつかの新機能と改善が含まれ、Go言語のパフォーマンスやユーザビリティがさらに向上しました。以下が主な変更点です。
- 主要な新機能:
-
- Windows向けに、標準ライブラリがコントロールグループのサポートやシステムコールの改善により、性能向上と安定性が強化されました。
- macOS向けの新しいサポートとして、ヒープメモリ使用量の削減や効率化が進められました。
- パフォーマンスの改善点:
-
- 文字列操作の最適化が行われ、
strings.Trimやstrings.Indexのパフォーマンスが向上しました。 - 並列ガベージコレクションが改良され、メモリ管理の効率が向上しています。
- コンパイラの境界チェックが一部のパターンで自動的に省略されるようになり、コード生成の効率がさらに向上しました。
- 文字列操作の最適化が行われ、
- デバッグ機能の改善:
-
- より正確な変数位置とスタック情報の提供により、デバッグ体験が改善されています。
- 新たにDWARF生成の機能が拡充され、特に最適化コードにおいて、デバッグ情報の信頼性が高まりました。
- ランタイムの改善:
-
- Windows上で、64ビットプロセスのアドレス空間使用が最適化され、より多くのメモリを使用可能になりました。
- Goランタイムのシグナルハンドリングが強化され、システムシグナルの処理能力が向上しました。
- 標準ライブラリの改善:
-
crypto/x509パッケージで、証明書の検証がmacOSのシステム証明書ストアを使用するようになり、macOSでの信頼性が向上しました。net/httpにおいて、HTTP/2の接続管理が改善され、特に大量接続環境での安定性が増しました。osパッケージのProcess.SignalがWindowsでも利用可能となり、Windows上のプロセス管理機能が強化されました。
- ツールの改善:
-
go testコマンドに-jsonフラグが追加され、テスト結果をJSON形式で出力できるようになりました。- goコマンドが
go.sumファイルを自動的に更新し、依存関係の信頼性が向上しています。 gofmtにおいて、特定のコードパターンの整形が改良され、より一貫したコードスタイルが保たれます。
また、OpenBSD 6.4以降、macOS 10.11 El Capitan以降、またはWindows 7以降が必要となり、これらのOSの以前のバージョンのサポートが終了しました。リリースノートでは、Go 1の互換性は維持されており、ほとんどのGoプログラムは以前と同様に動作すると述べられています。
Go 1.11
[編集]Go 1.11が、2018年8月にリリースされました[32][33]。 Go 1.11のリリースでは、いくつかの重要な新機能と改善が含まれています。最も注目すべき変更点は以下です。
- 主要な新機能:
-
- モジュールサポートの実験的な導入により、GOPATHに依存しない開発が可能になりました。バージョン管理と依存関係管理が統合され、より信頼性の高いビルドが実現できます。
- WebAssembly(js/wasm)の実験的なポートが追加され、syscall/jsパッケージを通じてJavaScriptとの連携が可能になりました。
- RISCVアーキテクチャ向けのGOARCH値("riscv"と"riscv64")が予約されました。
- パフォーマンスの改善点:
-
- マップのクリア操作が最適化され、
for k := range m { delete(m, k) }のようなコードが効率的に実行されるようになりました。 - スライス拡張の
append(s, make([]T, n)...)が最適化されました。 - コンパイラの境界チェックと分岐除去が大幅に改善され、より効率的なコードが生成されるようになりました。
- マップのクリア操作が最適化され、
- デバッグ機能の改善:
-
- 最適化されたバイナリのデバッグ情報が大幅に改善され、変数位置情報、行番号、ブレークポイント位置がより正確になりました。
- DWARFセクションがデフォルトで圧縮されるようになりました。
- デバッガー内からのGo関数呼び出しが実験的にサポートされました。
- ランタイムの改善:
-
- スパースヒープレイアウトの採用により、Goヒープサイズの制限(従来は512GiB)が撤廃されました。
- macOSとiOSで、カーネルの直接呼び出しの代わりにlibSystem.dylibを使用するように変更され、将来のOSバージョンとの互換性が向上しました。
- 標準ライブラリの改善:
-
crypto/cipherパッケージに、非標準のタグ長をサポートするGCM実装が追加されました。net/httpのTransport型に、ホストごとの最大接続数を制限するMaxConnsPerHostオプションが追加されました。osパッケージに、ユーザー固有のキャッシュディレクトリを取得するUserCacheDir関数が追加されました。
- ツールの改善:
-
- 環境変数
GOFLAGSが導入され、goコマンドのデフォルトフラグを設定できるようになりました。 - godocのWebサーバーが、APIの新機能がどのGoバージョンで導入されたかを表示するようになりました。
- 環境変数
また、OpenBSD 6.2以降、macOS 10.10 Yosemite以降、またはWindows 7以降が必要となり、これらのOSの以前のバージョンのサポートが終了しました。リリースノートでは、Go 1の互換性は維持されており、ほとんどのGoプログラムは以前と同様に動作すると述べられています。
Go 1.10
[編集]Go 1.10が、2018年2月にリリースされました[34][35]。 Go 1.10のリリースでは、開発体験を大幅に向上させる複数の重要な改善が含まれています。最も注目すべき変更点は以下です。
- ビルドシステムの大幅改善:
-
- ビルドキャッシュの導入により、最近ビルドしたパッケージが自動的にキャッシュされ、ビルド時間が大幅に短縮されました。
- テスト結果のキャッシュ化により、変更のないテストは再実行せずにキャッシュされた結果を使用するようになりました。
go test時にgo vetが自動実行され、テスト前にコードの問題を検出できるようになりました。go installコマンドが、コマンドラインで指定されたパッケージのみをインストールするように変更されました。
- cgoのセキュリティ強化と機能拡張:
-
- cgoの
#cgo CFLAGSなどで指定できるコンパイラオプションが安全なもののみに制限され、-fpluginなどの危険なオプションは使用できなくなりました。 - Go文字列値へのC言語からの直接アクセスが可能になり、
_GoString_型、_GoStringLen、_GoStringPtr関数が追加されました。 - CのtypedefがGoの型エイリアスとして実装され、
C.XとC.Yを相互に使用できるようになりました。
- cgoの
- パフォーマンスの改善点:
-
- ガベージコレクタが割り当て遅延への影響を軽減するよう改善されました。
- コンパイラの最適化によりコード生成品質が向上し、サポートされている全アーキテクチャで性能が向上しました。
- スタックトレースから暗黙のラッパー関数(
<autogenerated>マーク)が除外され、より読みやすくなりました。
- ツールの改善:
-
go docコマンドが、型Tを返すスライスや*Tを返す関数も型Tの表示に含めるようになりました。go testに-failfastフラグが追加され、テスト失敗時に残りのテストを停止できるようになりました。go test -jsonフラグが追加され、機械読み取り可能なJSON形式でテスト結果を出力できるようになりました。go getコマンドでFossilソースコードリポジトリがサポートされました。
- ランタイムの改善:
-
LockOSThreadとUnlockOSThreadの呼び出しがネストをサポートするようになりました。GOMAXPROCSの制限が撤廃されました(以前は1024が上限)。GOROOT関数が、環境変数が設定されていない場合にプログラムのコンパイル時の値を使用するようになりました。
- 標準ライブラリの改善:
-
stringsパッケージに新しいBuilder型が追加され、文字列構築時のメモリ効率が向上しました。mathパッケージにRound、RoundToEven、Erfinv、Erfcinv関数が追加されました。net/urlのResolveReferenceが複数の先頭スラッシュを保持するように修正され、RFC 3986に準拠しました。bytesパッケージのFields、Split系関数が、返すサブスライスの容量を長さと同じに設定するようになり、メモリ効率が向上しました。archive/tarとarchive/zipでより多くのヘッダー形式や時刻エンコーディングがサポートされました。
- デバッグ機能の改善:
-
- バイナリ内のDWARFデバッグ情報が改善され、定数値の記録、より正確な行番号情報、パッケージ単位でのコンパイル単位の表現が実現されました。
- 各種ビルドモードがより多くのシステムに対応し、
c-shared、pie、pluginモードの対応プラットフォームが拡張されました。
- アセンブラの拡張:
-
- ARM 32ビット、ARM 64ビット、PowerPC 64ビット、S390X、X86 64ビットアーキテクチャで多数の新しい命令がサポートされました。
- 特にX86 64ビットでは、AVX、AVX2、BMI、BMI2、F16C、FMA3、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2などの拡張命令セットを含む359の新命令が追加されました。
- ソースコードフォーマットの変更:
-
gofmtのデフォルトフォーマットに軽微な変更があり、3つのインデックスを持つスライス式と単一行のインターフェースリテラルの表示が改善されました。
Go 1.9
[編集]Go 1.9が、2017年8月にリリースされました[36][37]。 Go 1.9のリリースでは、言語、ツール、ランタイム、標準ライブラリに多くの変更と改善が含まれています。主な変更点は以下の通りです。
- 言語の変更点:
-
- 型エイリアス: パッケージ間で型を移動する際などに、段階的なコードの修正をサポートするための型エイリアスが導入されました。
type T1 = T2- の形式で宣言することで、既存の型 T2 に別の名前 T1 を与えることができます。
- 浮動小数点演算の融合: 言語仕様が更新され、実装が浮動小数点演算(例えば、積和演算)を融合することが許可される条件が定義されました。中間結果の丸めを強制したい場合は、float64(x*y) + z のように明示的な型変換が必要です。
- 型エイリアス: パッケージ間で型を移動する際などに、段階的なコードの修正をサポートするための型エイリアスが導入されました。
- 新しい標準パッケージ:
-
- math/bits: 符号なし整数のビット操作(カウント、操作など)のための最適化された実装を提供する新しいパッケージが追加されました。可能な場合、CPUの特殊な命令が利用されます。
- パフォーマンスの改善点:
-
- 並列コンパイル: パッケージ内の関数のコンパイルが並列化され、マルチコア環境でのビルド時間が改善されました。この機能はデフォルトで有効ですが、環境変数 GO19CONCURRENTCOMPILATION=0 を設定することで無効にできます。
- ガベージコレクション: ストップザワールド型のガベージコレクションを引き起こしていたライブラリ関数 (runtime.GC, debug.SetGCPercent, debug.FreeOSMemory) が、呼び出し元のゴルーチンのみをブロックする並行ガベージコレクションに変更されました。
- ツールの改善:
-
- Vendorディレクトリのマッチング: go test などのパッケージ名を引数に取るツールにおいて、./... が vendor ディレクトリ内のパッケージをマッチしなくなりました。vendor ディレクトリをマッチさせるには、./vendor/.... を使用する必要があります。
- GOROOTの移動: go tool は、実行されたパスからGoのインストールツリーのルートを特定するようになりました。これにより、Goのインストールディレクトリ全体を移動した場合でも、go tool が通常通り動作するはずです。
- go test -list: テスト、ベンチマーク、またはExampleの名前を正規表現でフィルタリングしてリスト表示する -list フラグが go test コマンドに追加されました。
- go env -json: 環境変数をJSON形式で出力する -json フラグが go env コマンドに追加されました。
- その他の注目すべき変更点:
-
- sync.Map: 並行アクセスに対応した新しいマップ型 sync.Map が追加されました。読み込み、書き込み、削除操作は償却定数時間で行われます。
- testing.Helper: testing.T および testing.B に Helper メソッドが追加されました。このメソッドを呼び出すと、エラー報告などでファイル名と行番号が表示される際に、ヘルパー関数自身ではなく、ヘルパー関数を呼び出した箇所の情報が表示されるようになります。
- timeパッケージ: time パッケージは、各 Time 値に透過的に単調時間(monotonic time)を追跡するようになり、壁時計の調整があっても二つの Time 値間の経過時間を安全に計算できるようになりました。
- runtime.CallersFrames: インライン化されたフレームを含むコールスタックの情報を正確に取得するために、runtime.Callers の結果を直接検査するのではなく、runtime.CallersFrames を使用することが推奨されるようになりました。
- runtime/pprof: runtime/pprof パッケージで生成されるプロファイルにシンボル情報が含まれるようになり、プロファイルを生成したバイナリなしで go tool pprof で表示できるようになりました。また、プロファイルレコードにラベルを追加する機能も追加されました。
Go 1.9には、上記以外にも多くの追加、改善、および修正が含まれています。詳細については、公式のリリースノートを参照してください。
Go 1.8
[編集]Go 1.8が、2017年2月にリリースされました[38][39]。 Go 1.8のリリースでは、ツールチェーン、ランタイム、およびライブラリの実装に多くの変更が含まれています。主な変更点は以下の通りです。
- 言語の変更点:
-
- 構造体型の変換: Go 1.8以降、構造体間の明示的な型変換において、タグが無視されるようになりました。タグのみが異なる2つの構造体は、相互に変換可能です。
- 浮動小数点定数の指数: 言語仕様が更新され、実装が浮動小数点定数で最大16ビットの指数をサポートすることが要求されるようになりました。ただし、"gc" と gccgo コンパイラは、どちらも32ビットの指数をサポートしています。
- ポート:
-
- 32-bit MIPSのサポート: Linux上で、big-endian (linux/mips) と little-endian (linux/mipsle) の両方のマシンで、FPUまたはカーネルFPUエミュレーションを備えたMIPS32r1命令セットを実装する32-bit MIPSがサポートされるようになりました。
- ツール:
-
- アセンブラ: 64-bit x86システム用に、VBROADCASTSD, BROADCASTSS, MOVDDUP, MOVSHDUP, MOVSLDUP, VMOVDDUP, VMOVSHDUP, VMOVSLDUPなどの命令が追加されました。
- Yacc: yaccツールは削除されました。
- Fix: fixツールに、"golang.org/x/net/context" から "context" へimportを変更する "context" fixが追加されました。
- Pprof: pprofツールは、"https+insecure" URLスキームを使用して、TLSサーバーをプロファイルし、証明書の検証をスキップできるようになりました。
- Trace: traceツールに、実行トレースからpprof互換のブロッキングおよびレイテンシプロファイルを生成するための -pprof フラグが追加されました。
- Vet: Vetは、いくつかの点でより厳密になり、以前に誤検出を引き起こしていた箇所ではより緩くなりました。
- コンパイラツールチェーン:
-
- SSAバックエンド: 64-bit x86システム用の新しいコンパイラバックエンドが導入されました。このバックエンドは、よりコンパクトで効率的なコードを生成し、境界チェックの排除などの最適化のためのより良いプラットフォームを提供します。
- コンパイラとリンカの最適化: コンパイラとリンカが最適化され、Go 1.7よりも高速に実行されるようになりました。
- Cgo:
-
- Goツールは、make.bash中に設定されたCGO_ENABLED環境変数の値を記憶し、デフォルトですべての将来のコンパイルに適用するようになりました。
- デフォルトのGOPATH:
-
- GOPATH環境変数が設定されていない場合、デフォルト値を持つようになりました。Unixでは$HOME/go、Windowsでは%USERPROFILE%/goがデフォルトです。
- Go get:
-
- "go get"コマンドは、-insecureフラグが使用されているかどうかに関係なく、HTTPプロキシ環境変数を常に尊重するようになりました。
- Go bug:
-
- 新しい "go bug" コマンドは、現在のシステムに関する情報が事前に入力された状態で、GitHubでバグレポートを開始します。
- Go doc:
-
- "go doc" コマンドは、godocの動作に従い、定数と変数をその型でグループ化するようになりました。
- プラグイン:
-
- Goは、Goで記述されたプラグインを生成するための "plugin" ビルドモードと、実行時にそのようなプラグインをロードするための新しい plugin パッケージによる、プラグインの初期サポートを提供するようになりました。
- ランタイム:
-
- 引数の活性: ガベージコレクタは、関数全体の引数をライブとは見なしなくなりました。
- 並行マップの誤用: Go 1.6で、マップの並行誤用の軽量でベストエフォートな検出が追加されました。このリリースでは、マップへの並行書き込みと反復処理を行うプログラムの検出がサポートされ、その検出器が改善されました。
- パフォーマンス:
-
- ガベージコレクションの一時停止が大幅に短縮され、通常は100マイクロ秒未満、多くの場合10マイクロ秒程度になりました。
- deferred関数呼び出しのオーバーヘッドが約半分に削減されました。
- GoからCへの呼び出しのオーバーヘッドが約半分に削減されました。
- 標準ライブラリ:
-
- Examples: 多くのパッケージに例が追加されました。
- Sort: sortパッケージに、less関数を指定してスライスをソートするための便利な関数Sliceが含まれるようになりました。
- HTTP/2 Push: net/httpパッケージに、HandlerからHTTP/2サーバープッシュを送信するメカニズムが含まれるようになりました。
- HTTPサーバーの正常シャットダウン: HTTPサーバーは、新しいServer.Shutdownメソッドを使用した正常シャットダウンと、新しいServer.Closeメソッドを使用した突然のシャットダウンをサポートするようになりました。
- コンテキストのサポート: context.Contextの標準ライブラリへの採用を継続し、Go 1.8は、既存のパッケージへのコンテキストサポートを追加しました。
- Mutex競合プロファイリング: ランタイムとツールが、競合するmutexのプロファイリングをサポートするようになりました。
Go 1.8には、上記以外にも多くの追加、改善、および修正が含まれています。詳細については、公式のリリースノートを参照してください。
Go 1.7
[編集]Go 1.7が、2016年8月にリリースされました[40][41]。 主な変更点は以下の通りです。
- 主な変更点
- 言語仕様: 終了ステートメントの定義を明確化(既存の挙動を正式化)
- パフォーマンス: x86-64向け新しいコンパイラバックエンドで5-35%の性能向上
- 標準ライブラリ:
contextパッケージが標準ライブラリに昇格net/http/httptraceパッケージ追加- テスト階層構造をサポート(サブテスト/サブベンチマーク)
- ツールチェーン:
- ビルド時間の改善
- バイナリサイズの削減(20-30%減少することも)
- ベンダリングサポートが正式機能に
- ポート:
- macOS 10.12 Sierraサポート追加
- Linux on z Systems(s390x)の実験的サポート追加
- 互換性
Go 1の互換性保証を維持。ほとんどのGoプログラムは変更なしで動作する見込み。
- その他の注目点
- ガベージコレクションの一時停止時間が短縮
- 多数の標準ライブラリで10%以上の性能改善
- Unicode 9.0サポート
- WindowsでのメモリOS返還サポート
- 実行トレースの収集オーバーヘッドが大幅改善(400%→25%)
このリリースは主にツールチェーン、ランタイム、ライブラリの実装改善に焦点を当てています。
Go 1.6
[編集]Go 1.6が、2016年2月17日にリリースされました[42][43]。 主な変更点は以下の通りです。
- 主な変更点
- 言語仕様: 言語仕様の変更なし
- パフォーマンス:
- Go 1ベンチマークスイートのプログラムが平均数パーセント高速化
- ガベージコレクターの一時停止時間がさらに短縮(特にメモリを大量に使用するプログラムで)
compress/bzip2、compress/gzip、crypto/aes、crypto/elliptic、crypto/ecdsa、sortパッケージで10%以上の最適化sort.Sortの実装が効率化され、約10%高速化
- 標準ライブラリ:
net/httpパッケージがHTTPS使用時にHTTP/2を透過的かつ自動的にサポートtext/templateパッケージにテンプレート再利用の新メカニズムを追加(アクション周りの空白除去、テンプレート:Blockアクション)
- ツールチェーン:
- パーサーがyacc生成のものから手書きのものに変更
linux/amd64向けにClang MemorySanitizerとの連携のための新しい-msanフラグを追加- リンカーに新しい
-libgccオプションを追加 - Go 1.5で導入されたビルドモードを多くのシステムに拡張(
c-shared、shared、新しいpieモード) goコマンドがベンダリングをデフォルトで有効化(Go 1.5では実験的機能)go docコマンドの曖昧性解消を改善(ベンダリングされたコピーよりも元のパッケージを優先)go vetコマンドが関数やメソッドの値をPrintfに誤って渡す診断を開始
- ポート:
- 64ビットMIPS上のLinuxと32ビットx86上のAndroidへの実験的な新しいポートを追加
- 互換性
Go 1の互換性保証を維持。ほとんどのGoプログラムは変更なしでコンパイルおよび実行される見込み。
- その他の注目点
- ランタイムでマップの同時誤用を軽量に検出(検出された場合はプログラムがクラッシュ)
- プログラム終了時のパニックについて、ランタイムがデフォルトで実行中のゴルーチンのスタックのみを出力
- Goのガベージコレクターとの互換性を確保するため、GoポインタとCコード間の共有ルールを明確化し、強制
- Windowsでのグローバルタイマー解像度の1ms強制を停止
-buildmode=c-archiveまたは-buildmode=c-sharedでビルドされたアーカイブおよび共有ライブラリのシグナルハンドリングを変更reflectパッケージで、エクスポートされたフィールドを含む埋め込まれた非エクスポート構造体型に関する非互換性を解決
Go 1.5
[編集]Go 1.5が、2015年8月19日にリリースされました[44][45]。 主な変更点は以下の通りです。
- 主な変更点
- 言語仕様:
- マップリテラルの要素型の省略を許可する構文の制限が緩和
- パフォーマンス:
- ガベージコレクターが再設計され、並行処理可能に。一時停止時間が劇的に短縮され、通常10ミリ秒未満に
- スケジューラーの改善により、
GOMAXPROCSのデフォルト値が論理CPU数に変更
- 標準ライブラリ:
flagパッケージでよりクリーンな使用法メッセージmath/bigに任意精度浮動小数点数用の新しいFloat型を追加- LinuxおよびBSDシステム上のDNSリゾルバーの改善により、名前ルックアップのcgo要件を削除
go/typesパッケージが標準ライブラリに移動reflectパッケージにArrayOfおよびFuncOf関数が追加
- ツールチェーン:
- コンパイラとランタイムが完全にGoで記述され、GoコードベースからすべてのCコードが削除
- 従来のツール名(例:
6g、8g)が廃止され、go tool compile、go tool asm、go tool linkなどの単一バイナリに置き換え - 中間オブジェクトファイルが
.6、.8などの代わりに.oサフィックスを使用 go/typesパッケージの移動に伴い、vetおよびcoverツールも移動- コンパイラが定数評価に
math/bigパッケージを使用 - アセンブラが新しいネイティブGo実装になり、わずかな互換性変更あり
- リンカーに拡張されたリンクスタイル(共有ライブラリのビルドなど)のための
-buildmodeオプションを導入 go tool vetコマンドが構造体タグのより厳密な検証を実行go testコマンドに新しい-countフラグ、go generateに-runオプションと新しい環境変数を追加go getコマンドに新しい-insecureフラグを追加- 外部依存関係の「ベンダリング」に対する実験的なサポートが導入(
goコマンドが有効化)
- ポート:
- Snow Leopardおよび
dragonfly/386のサポートが終了 darwin/arm、darwin/arm64(AppleのiPhoneおよびiPad用)、linux/arm64、ppc64、ppc64le(IBM 64ビットPowerPC)を含む新しいポートがソースから利用可能- FreeBSD (8-STABLE以上) およびNaCl (SDKバージョンpepper-41) の特定の要件
- Solarisポートで完全な
cgoサポートとnetおよびcrypto/x509の改善
- Snow Leopardおよび
- 互換性
主要なアーキテクチャ変更にもかかわらず、Go 1の互換性保証を維持。ほとんどのGoプログラムは以前と同様にコンパイルおよび実行される見込み。ただし、ゴルーチンスケジューリング順序に暗黙的に依存するプログラムや、複数のコアでの実行を想定していないプログラム(GOMAXPROCSのデフォルト値変更のため)は更新が必要になる場合がある。
- その他の注目点
- 内部パッケージのサポートがすべてのリポジトリで提供
installサブコマンドがソースディレクトリにbuildによって作成されたバイナリを削除- 新しいビルドオプションとして
-asmflags、-buildmode、-pkgdir、-toolexecが追加 -ccflagsオプションが削除
Go 1.4
[編集]Go 1.4が、2014年12月にリリースされました[46][47]。
Go 1.4は、Go 1.3から約半年後のリリースとなり、プロジェクトの歴史において「実装のクリーンアップ」と「将来のプラットフォームへの布石」となる重要なバージョンです。最も注目すべき変更点は以下です。
- 言語の変更点:
-
- for-rangeループの簡略化:ループ変数を必要としない場合に、変数名を省略して
for range s { ... }と記述できるようになりました。 - メソッド呼び出しの厳格化:ポインタではないレシーバを持つメソッドを、二重ポインタ(
**T)から直接呼び出すことが禁止されました。
- for-rangeループの簡略化:ループ変数を必要としない場合に、変数名を省略して
- 新しいプラットフォームのサポート:
-
- Androidのサポート:
GOOS=android、GOARCH=armが追加されました。これにより、Goで書かれたライブラリをAndroidアプリ(Java/Kotlin)から呼び出すための基盤が整いました。 - ARM64の実験的サポート:将来の64ビットARMプロセッサを見据え、
linux/arm64のサポートが開始されました。
- Androidのサポート:
- ツールの改善:
-
- go generateコマンドの導入:ソースコード内のコメント(
//go:generate ...)をスキャンしてコード生成ツールを実行する新しいサブコマンドが追加されました。これにより、stringerなどのツールを用いたメタプログラミングが容易になりました。 - ビルド速度の改善:コンパイラの一部がCからGoへ書き換えられ始めた過渡期であり、ツールチェーン全体の整理が進められました。
- go generateコマンドの導入:ソースコード内のコメント(
- ランタイムの改善:
-
- スタック管理の変更:連続スタック(contiguous stacks)の導入により、以前の「セグメントスタック」で発生していた「ホットスプリット問題(スタックの拡張と縮小が頻発してパフォーマンスが低下する現象)」が解消されました。
- ガベージコレクタの改良:ガベージコレクションの並行処理化に向けた準備として、ランタイムの内部構造が大幅に再設計されました。
- 標準ライブラリの改善:
-
- contextパッケージの萌芽:この時期、
golang.org/x/net/contextパッケージが開発され、Google内部で広く使われ始めました(後にGo 1.7で標準ライブラリ入りします)。 - OSインターフェースの拡充:
osパッケージやnetパッケージにおいて、システムリソースへのアクセス効率が向上しました。
- contextパッケージの萌芽:この時期、
Go 1.4は、Go言語が誕生以来使用してきたC言語による実装から、Go自身でGoをコンパイルする「セルフホスティング」へと移行するための重要なステップとなりました。
Go 1.3
[編集]Go 1.3が、2014年6月にリリースされました[48][49]。
Go 1.3は、Go 1.2から約半年後のリリースとなり、言語仕様自体の変更を含まない一方で、「ランタイムの大幅なパフォーマンス向上」と「ツールチェーンの再設計・近代化」に深く焦点を当てた重要なバージョンです。最も注目すべき変更点は以下です。
- 言語の変更点:
-
- 仕様変更なし:Go 1互換性ガイドラインに基づき、言語仕様自体への変更や追加はありません。既存のソースコードはそのまま完全にコンパイル可能です。
- 新しいプラットフォームのサポート:
-
- Solarisのサポート:
GOOS=solaris、GOARCH=amd64が追加され、SolarisおよびIllumosベースのシステムが公式にサポートされました。 - Plan 9のサポート改善:
GOOS=plan9において、AMD64アーキテクチャ(GOARCH=amd64)のサポートが追加されました。 - Native Client (NaCl) の拡張:Googleの安全なコード実行環境であるNative Clientにおいて、従来のx86(32ビット/64ビット)に加えてARMアーキテクチャ(
GOARCH=arm)がサポートされました。
- Solarisのサポート:
- ツールの改善:
-
- リンカーとコンパイラの再構成:C言語で書かれていた従来のツールチェーン(
6g、6lなど)を、Go言語自身で書き換える(セルフホスティング)ための前段階として、リンカーの内部構造を分割・整理する基礎工作が行われました。 - godocの静的解析機能:
godocに高度な静的解析機能(型分析、コールグラフ、メソッドセットの表示など)が統合され、コードブラウジングが強力になりました。 - go testの機能拡張:
go test -cpuフラグで複数のCPUカウントをカンマ区切りで指定できるようになり、異なる並行度でのテストが容易になりました。また、ベンチマーク中のメモリアロケーション統計(-benchmem)がデフォルトで強化されました。
- リンカーとコンパイラの再構成:C言語で書かれていた従来のツールチェーン(
- ランタイムの改善:
-
- スタック管理の変更(スタックコピーの導入):従来の「セグメントスタック(分割スタック)」方式から、必要に応じて新しいメモリ領域を確保してスタック全体を丸ごとコピーする「スタックコピー(後に連続スタックへと繋がる基盤)」方式へ移行が始まりました。これにより、スタック境界で関数呼び出しが繰り返される際のオーバーヘッドが激減しました。
- 正確なガベージコレクション(Precise GC)の進展:ガベージコレクタがさらに精密化され、スタック上のポインタと非ポインタ(整数など)を完全に区別できるようになりました。これにより、誤ってメモリが保持され続ける「メモリリーク(浮遊ポインタ問題)」が解消され、ヒープサイズが縮小しました。
- 標準ライブラリの改善:
-
- sync.Poolの導入:ガベージコレクションの負荷を軽減するため、割り当て済みのオブジェクトを再利用するための並行安全なキャッシュ機構
sync.Poolが追加されました。高性能なネットワークサーバーなどの実装で劇的な効果を発揮します。 - パフォーマンスの最適化:
crypto/x509、fmt、net、os、reflectなどの主要パッケージでリファクタリングが行われ、多くのアロケーションが削減されたことで、実行速度が全体的に大幅に向上しました。
- sync.Poolの導入:ガベージコレクションの負荷を軽減するため、割り当て済みのオブジェクトを再利用するための並行安全なキャッシュ機構
Go 1.3は、目に見える新機能こそ控えめですが、ランタイムの足腰を徹底的に鍛え上げ、次期バージョン(Go 1.4)以降で本格化する「コンパイラの100% Go言語化(セルフホスティング)」および「完全並行GC」へと向かうための、極めて強固なバイパス(土台)を築いたリリースです。
Go 1.2
[編集]Go 1.2が、2013年12月にリリースされました[50][51]。
Go 1.2は、Go 1.1のリリースから約半年後に提供され、言語仕様への細かな利便性の向上、開発ツールの強力なアップグレード、そしてランタイムのさらなる安定化をもたらしたバージョンです。互換性を維持しつつ、日々の開発体験を向上させる実用的な変更が多く含まれています。最も注目すべき変更点は以下です。
- 言語の変更点:
-
- 3引数スライス(スライス容量の制御):スライス式において、従来の
s[i:j]に加え、3つ目の引数を指定するs[i:j:k]という構文(3-index slices)が導入されました。これにより、得られる部分スライスの容量(cap)を最大kまでに制限できるようになり、サブスライスへの追加操作(append)が意図せず元配列の背後にあるメモリを上書きしてしまうリスクを安全に排除できるようになりました。
- 3引数スライス(スライス容量の制御):スライス式において、従来の
- 新しいプラットフォームのサポート:
-
- 特定のアーキテクチャへの特記なし:既存のOS(Linux、Mac OS X、FreeBSD、Windowsなど)およびアーキテクチャ(amd64、386、arm)への最適化とバグ修正が中心であり、新しいOSターゲットの追加はこのバージョンでは行われませんでした。
- ツールの改善:
-
- テストカバレッジツールの導入(go test -cover):
go testコマンドに-coverフラグが追加され、コードのテストカバレッジを測定できるようになりました。これに伴い、新ツールgo tool coverが提供され、どのコードパスが実行され、どのパスが実行されていないかをブラウザ上で色分けして視覚的に確認できるHTMLレポートの生成が可能になりました。 - go testの並行実行制御:
go testに-cpuフラグの動作が調整されたほか、複数パッケージのテストを並行して実行するための-pフラグの挙動が洗練されました。
- テストカバレッジツールの導入(go test -cover):
- ランタイムの改善:
-
- ゴルーチンのプリエンプション(協調的スケジューリングの強化):ランタイムのスケジューラが拡張され、関数呼び出しのタイミングで自動的にプリエンプション(実行権の譲渡)チェックが挟まれるようになりました。これにより、タイトなループを実行し続ける特定のゴルーチンが1つのスレッドを占有し続け、他のゴルーチンやガベージコレクション(GC)の呼び出しを停止させてしまう問題(飢餓状態)が大幅に緩和されました。
- スレッド制限の導入:デフォルトで1つのプログラムが作成できるオペレーティングシステム(OS)のスレッド数が最大10,000個に制限されました(
runtime/debug.SetMaxThreadsで変更可能)。これは、無限にスレッドが生成されてシステム全体のメモリを枯渇させる暴走バグを防ぐための安全策です。
- 標準ライブラリの改善:
-
- imageパッケージの刷新:
imageおよびimage/colorパッケージにいくつかの新しいインターフェースと、パフォーマンス向上のためのピクセル精度の最適化が施されました。 - 多くのパッケージでの最適化:
compress/bzip2、encoding/json、netなどの主要パッケージで、不要なアロケーションの削減やアルゴリズムのブラッシュアップが行われ、実行効率が向上しました。
- imageパッケージの刷新:
Go 1.2は、仕様を大きく変えることなく、3引数スライスによる「堅牢性の向上」や、カバレッジツールによる「品質管理の容易化」、そしてスケジューラ改善による「並行処理の安定化」を確実にもたらしました。地味ながらも、プロダクション環境での信頼性を引き上げる確実な一歩となったリリースです。
Go 1.1
[編集]Go 1.1が、2013年5月にリリースされました[52][53]。
Go 1.1は、2012年3月のGo 1.0リリース以来、初めてのメジャーアップデートとなります。Go 1の「互換性約束(Compatibility Guarantee)」を厳格に守りつつ、コミュニティからのフィードバックを反映して、パフォーマンスの大幅な向上、言語仕様の洗練、そして開発ツールの強化が図られました。最も注目すべき変更点は以下です。
- 言語の変更点:
-
- メソッド値(Method Values)の導入:オブジェクトのメソッドを、レシーバ(そのオブジェクト自身)を束縛した状態の関数値として直接取り出せるようになりました。たとえば、f := obj.Method と記述して、後から f() として呼び出すことが可能です。これにより、イベントハンドラやコールバックの記述が非常に簡潔になりました。
- 戻り値の要件の厳格化(および合理化):値を返す関数において、制御フローの末尾(terminate statement)に return がない場合のコンパイラチェックが厳密になりました。一方で、panic や無限ループで終わるパスなど、明らかに終端に到達しないコードベースでは return を省略できるよう仕様が整理されました。
- 整数除算のゼロ除算のランタイムエラー化:定数ではない変数によるゼロ除算(x / 0)が、コンパイル時だけでなく実行時にも一貫してランタイムパニックを発生させるよう挙動が統一されました。
- 新しいプラットフォームのサポート:
-
- ARMアーキテクチャのサポート強化:GOARCH=arm において、浮動小数点演算のハードウェアアクセラレーション(GOARM=7 など)の対応が進み、Raspberry Piなどの組み込みデバイスでの実行速度が飛躍的に向上しました。
- プラットフォームの実験的追加:freebsd/arm や netbsd/386 などの新しいOS・アーキテクチャの組み合わせへの移植が開始されました。
- ツールの改善:
-
- goコマンドの機能拡充:go get や go test などのサブコマンドが大幅に強化されました。特に、他のリポジトリの依存関係の処理がスムーズになり、並行してテストを実行する仕組みが洗練されました。
- レースディテクタ(Race Detector)の搭載:データ競合(Data Race)を検出するための強力なツール -race フラグが go test、go run、go build に導入されました(ThreadSanitizerをバックエンドに使用)。並行処理プログラムにおいて、複数のゴルーチンが同期なしに同じメモリにアクセスする潜在的バグを自動で暴き出すことができます。
- vetツールの標準化:コードの静的解析を行い、ミス(Printf のフォーマット指定子の間違いなど)を検出する go vet コマンドが正式にツールチェーンに統合されました。
- ランタイムの改善:
-
- パフォーマンスの劇的な向上(GCとスケジューラ):メモリ割り当て(アロケータ)の効率化、およびガベージコレクタ(GC)のマップ処理の最適化により、多くのプログラムで数10%〜2倍以上の高速化を達成しました。
- 新スケジューラ(G-M-Pモデル)への刷新:ランタイムのゴルーチンスケジューラが全面的に書き換えられました。これまでの単一のグローバルロックによるボトルネックが解消され、複数CPUコア(GOMAXPROCS)を有効にしたマルチスレッド環境における並行処理のスケール性能が爆発的に向上しました。
- 標準ライブラリの改善:
-
- netパッケージの刷新:ネットワーク接続のタイムアウト処理や非同期I/Oのバックエンドが刷新され、より高負荷な通信を安定して捌けるようになりました。
- 新規パッケージの追加:文字列やバイト列の効率的なプールを提供する bytes.Buffer の見直しや、データ構造を扱う各種内部パッケージの最適化が行われました。
Go 1.1は、最初のリリースで確立された「安定性」という土台の上に、プロダクション環境で戦うための「圧倒的な速度」と「バグを撃退する強力なツール(レースディテクタ)」を実装した、Go言語の進化において最もエキサイティングなマイルストーンの1つです。
Go 1.0
[編集]Go 1.0が、2012年3月にリリースされました[54][55]。
Go 1.0は、2009年のオープンソース化以来、数年間にわたる活発な開発とコミュニティからのフィードバックを経て到達した、Goプロジェクト史上初の「安定版(Major Stable Release)」です。最大の特徴は、企業や開発者がプロダクション環境で安心して採用できるよう、将来にわたるソースコードの互換性を保証する「Go 1 互換性約束(Compatibility Guarantee)」が確立された点にあります。最も注目すべき変更点と仕様の確定は以下です。
- 言語の確定と変更点:
-
- 互換性の保証(Go 1の約束):Go 1.0で記述された標準仕様に準拠するソースコードは、将来のGo 1.x系バージョンにおいても修正なしでコンパイルでき、同じ動作をすることが保証されました。これにより、言語仕様の頻繁な変更に追われるリスクが解消されました。
- 新しい型システムと複素数:complex64 および complex128 が組み込み型として完全に統合されました。また、エラー表現のための標準的なインターフェースとして error 型が導入され、従来の os.Error から置き換えられました。
- マップとスライスのリテラル形式の洗練:複合リテラル(Composite Literals)の記述において、要素の型を明示的に反復しなくても推論できるケースが増え、コードがより簡潔に記述できるようになりました。
- プラットフォームのサポート:
-
- OSとアーキテクチャの公式サポート:Linux(386/amd64/arm)、Mac OS X(Darwin 386/amd64)、FreeBSD(386/amd64)、およびWindows(386/amd64)が、第1級の市民として公式サポート対象となりました。
- ツールの標準化:
-
- goコマンド(go tool)の誕生:従来の 6g、6l、make、gotest、goinstall といったバラバラだったコンパイル・ビルド・パッケージ管理・テスト用のツール群が、すべて単一の go コマンド(go build, go install, go test, go get など)に統合されました。これにより、Makefileなしで依存関係を自動解決してビルドする近代的な開発環境が完成しました。
- コードフォーマッタ(gofmt)の確定:コードの自動整形ツール gofmt の挙動が公式スタイルとして固定され、コミュニティ全体で一貫した読みやすいコードベースを維持する文化が決定づけられました。
- 移行ツール(go fix)の提供:週次ビルドや古いプレリリース(r60など)のコードを、Go 1.0の標準仕様へ自動的に書き換えるための go fix ツールが提供され、スムーズな移行が促されました。
- ランタイムとメモリの改善:
-
- ガベージコレクタとスケジューラの基本設計:並行処理を安全に行うためのゴルーチン(Goroutines)のスケジューリング機構、およびヒープメモリの自動管理を行うガベージコレクタ(GC)が、安定稼働を最優先とした第1世代の設計として統合されました。
- 標準ライブラリの再編成:
-
- ディレクトリ構造の大規模な整理:初期の雑多なパッケージ配置が見直され、現在の net/http、encoding/json、crypto といった論理的でクリーンな階層構造へと徹底的に再構成されました。
- 一貫したAPIデザイン:すべてのパッケージにおいて、関数の命名規則(大文字開始によるエクスポート)や、エラーを関数の最後の戻り値((result, error))として返すシグネチャの統一が完了しました。
Go 1.0は、一言語のリリースにとどまらず、「言語仕様」「標準ツールチェーン」「標準ライブラリ」が三位一体となり、後方互換性を強く宣言したことで、Go言語が実験的なプロジェクトから、世界規模のクラウドインフラやバックエンドシステムを支える実用言語へと本格的に羽ばたくための不朽の原点となりました。
Go1.0前史
[編集]Goが2012年3月にメジャー安定版である「Go 1.0」として結実するまでには、約4年半にわたる「知的な実験」と「過酷な試行錯誤」の歴史(前史)が存在します。
UNIXやC言語、Plan 9を生み出した伝説的なエンジニアたちが、Googleという巨大なインフラの中で直面した課題を解決するために始めたプロジェクト――それがGoの始まりでした。
1. プロジェクトの誕生と動機(2007年)
[編集]Goプロジェクトは、2007年9月21日、Googleのエンジニアであったロバート・グリースマー(Robert Griesemer)、ロブ・パイク(Rob Pike)、ケン・トンプソン(Ken Thompson)の3人によるホワイトボードの前での議論から始まりました。
彼らが共有していたのは、当時のソフトウェア開発環境、特にGoogle内部で主流だったC++による大規模システム開発に対する強い「不満」と「危機感」でした。
- ハードウェアの進化との乖離: コンピュータはマルチコア化し、大規模なクラスタで動作する時代になっていたにもかかわらず、C++やJavaなどの言語はシングルコア時代の設計を引きずっており、並行処理(Concurrency)の記述が非常に複雑でエラーを誘発しやすかったこと。
- ビルド時間の爆発: Googleの超巨大なコードベースをC++でビルドすると、ヘッダーファイルの依存関係の複雑さから、コンパイルに数時間から数日を要する「ビルド待ち時間」が発生し、開発効率を著しく低下させていたこと。
- 言語の肥大化と認知負荷: 言語に機能(パラダイム)が追加され続けることで複雑化し、他人が書いたコードを理解するコストが跳ね上がっていたこと。
彼らは「システムプログラミング言語が持つべき『効率性・静的型付けの安全性』と、動的言語(PythonやJavaScriptなど)が持つ『開発の手軽さ・俊敏さ』を高い次元で融合させた、21世紀のインフラのための新しい言語」を求めたのです。
2. 黎明期の設計と実装(2008年)
[編集]2008年初頭、言語のプロトタイプ作成が本格化します。この時期に、現在のGoの根幹をなす特徴的な機能が次々と形作られていきました。
- コンパイラの着手: ケン・トンプソンが、自身のUNIX時代の知見を活かしてC言語で独自のコンパイラ群(後にx86向けに
6g、6lなどと呼ばれるツールチェーン)を書き始めました。 - C言語ライクからの脱却: 当初はC言語の純粋な拡張として構文を検討していましたが、宣言の記述順序(型を後ろに書く
x int形式)の変更や、セミコロンの自動挿入、暗黙の型変換の禁止など、クリーンで厳格な構文へと舵を切りました。 - インターフェースと並行処理の融合: ロバート・グリースマーによる構造的型付け(Structural Typing)に基づく「明示的な宣言を必要としないインターフェース」の設計、そしてロブ・パイクによるPlan 9(NewsqueakやAlef)の知見をベースにした「チャネル(Channels)とゴルーチン(Goroutines)による通信」のアイデアが組み込まれました。
この年、コンパイラ開発の専門家であるイアン・ランス・テイラー(Ian Lance Taylor)がプロジェクトに参加し、GCCのフロントエンドとして gccgo の開発を開始。これにより、Goの設計が特定のコンパイラ実装に依存しない汎用的なものであることが証明されました。また、後にGoの主要開発者となるラサ・コックス(Russ Cox)も加わり、ランタイムや標準ライブラリの整備が急速に進みます。
3. オープンソース化(2009年11月)
[編集]2009年11月10日、Goは世界に向けてオープンソースプロジェクトとして電撃的に発表されました。
当初は「Googleがまた新しい言語を作った」という好奇の目で見られましたが、その極端なシンプルさとコンパイルの圧倒的な速さは、初期の目の肥えたハッカーたちを魅了しました。
しかし、オープンソース化直後のGo(いわゆる「プレGo 1.0」時代)は、現在のモダンなGoからは想像もつかないほど激動の、そして「毎週のようにコードが壊れる」過酷な開発環境でした。
4. ウィークリービルド(Weekly)とリリース(R)の時代(2009年 - 2011年)
[編集]Go 1.0がリリースされるまでの約2年間、公式の安定版というものは存在せず、開発は weekly(週次ビルド)および release(r56, r60 など)というバージョン名で刻まれていました。
この時代の主な特徴と混乱は以下の通りです。
① 頻繁な言語仕様の変更(破壊的変更)
[編集]言語のコア機能や組み込み関数が、毎週のように追加・削除・変更されました。
closedからpanicへ: 当初、チャネルが閉じられたかどうかを検知する組み込み関数closed()がありましたが、後に削除され、現在のv, ok := <-ch形式へ統合されました。mapのアクセス構文: マップにキーが存在するかを調べる構文も二転三転し、一時は専用のビルトイン関数が検討されたこともありました。- 新しいキーワードの追加と廃止: メモリ割り当ての
newとmakeの役割分担の整理や、初期にあった特殊な制御構文のスクラップ・アンド・ビルドが繰り返されました。
② ばらばらのツールチェーン
[編集]当時はまだ go コマンドがありませんでした。開発者は以下のような手順を手動(またはMakefile)で行っていました。
- x86-64環境であれば、コンパイルには
6g、リンクには6lコマンドを直接叩く。 - 32ビットx86であれば
8g/8l、ARMであれば5g/5lを使う。 - パッケージのインストールには
goinstall、テストにはgotestという別個のスクラップスクリプトが使われており、プロジェクトのビルド管理は非常に煩雑でした。
③ 標準ライブラリの未成熟と「os.Error」
[編集]現在おなじみの error インターフェース(組み込み型)は存在せず、os パッケージの中に os.Error という型として定義されていました。このため、文字通りあらゆるパッケージが os パッケージに依存するという、不健全な依存構造(循環参照のリスク)を抱えていました。
5. 「Go 1」へのカウントダウンと大掃除(2011年後半)
[編集]世界中で徐々にGoが本番環境(初期のCloudflareやSoundCloudなど)で使われ始めるにつれ、「毎週のように仕様が変わり、アップデートするたびにコードが動かなくなる言語は、企業のシステムでは怖くて使えない」という悲鳴が上がりました。
これを受けたコア開発チームは、言語を広く普及させるためには「一切の破壊的変更を止め、後方互換性を永久に保証するマイルストーン」が必要であると決断します。これが「Go 1 共同宣言(Go 1 Release Planning)」です。
2011年後半から2012年3月にかけて、チームは「最後の大掃除」に着手しました。
os.Errorから 組み込みのerrorへの格上げ: 依存関係をクリーンにするため、言語自体の組み込み型としてerrorインターフェースを再定義しました。- パッケージの統廃合: 雑多に広がっていた標準ライブラリ(
container/vectorの廃止、os/signalへの整理など)のレイアウトを徹底的にリファクタリングしました。 goコマンドの誕生: ラサ・コックスらにより、バラバラだったコンパイル環境を1つに統合するgoコマンドが設計され、Makefileが不要なモダンなビルドエコシステムが完成しました。go fixの提供: これまで毎週の破壊的変更に苦しんできた世界中の開発者のために、古いプレリリースのソースコードを自動的に「Go 1.0 仕様」へと一括置換・修正してくれる救済ツール(go fix)が開発されました。
そして「原点」へ
[編集]2012年3月28日、すべての仕様が凍結され、未来永劫の互換性を誓ったGo 1.0が正式にリリースされました。
カオスに満ちた4年半の「前史」で流された無数のリファクタリングの血と、UNIXの巨匠たちがこだわった「引き算の美学(不要な機能を入れない)」があったからこそ、Goは今日に至るまで「10年前のコードが今でもそのまま動く」という、圧倒的な安定性と信頼性を手に入れることができたのです。
脚註
[編集]- ^ “Introduction¶”. The Go Programming Language Specification Language version go1.23 (June 13, 2024). The Go website. (June 13, 2024).
- ^ Go 1.26 Release Notes - The Go Programming Language. (2026/02/10) 2026年2月11日閲覧。.
- ^ Go 1.26 is released! - The Go Programming Language. (2026/02/10) 2026年2月11日閲覧。.
- ^ Go 1.25 Release Notes - The Go Programming Language. (2025/08/12) 2025年9月27日閲覧。.
- ^ Go 1.25 is released! - The Go Programming Language. (2025/08/12) 2025年9月27日閲覧。.
- ^ Go 1.24 Release Notes - The Go Programming Language. (2025/02/11) 2025年2月23日閲覧。.
- ^ Go 1.24 is released! - The Go Programming Language. (2025/02/11) 2025年2月23日閲覧。.
- ^ Go 1.23 Release Notes - The Go Programming Language. (2024/08/13) 2024年11月13日閲覧。.
- ^ Go 1.23 is released! - The Go Programming Language. (2024/08/13) 2024年11月13日閲覧。.
- ^ Go 1.22 Release Notes - The Go Programming Language. (2024/02/06) 2024年2月11日閲覧。.
- ^ Go 1.22 is released! - The Go Programming Language. (2024/02/06) 2024年2月11日閲覧。.
- ^ Go 1.21 Release Notes - The Go Programming Language. (2023/08/08) 2023年11月28日閲覧。.
- ^ [https://go.dev/blog/go1.21 Go 1.21 is released! - The Go Programming Language 5]. (2023/08/08) 2023年11月28日閲覧。.
- ^ Go 1.20 Release Notes - The Go Programming Language. (2023/02/01) 2023年3月5日閲覧。.
- ^ Go 1.20 is released! - The Go Programming Language. (2023/02/01) 2023年3月5日閲覧。.
- ^ Go 1.19 Release Notes - The Go Programming Language. (2022/08/02) 2022年8月4日閲覧。.
- ^ Go 1.19 is released! - The Go Programming Language. (2022/08/02) 2022年8月4日閲覧。.
- ^ Go 1.18 Release Notes - The Go Programming Language. (2022/03/10) 2022年8月4日閲覧。.
- ^ Type Parameters Proposal 2021年9月30日閲覧。.
- ^ Go 1.17 Release Notes - The Go Programming Language. (2021/08/16) 2023年3月6日閲覧。.
- ^ Go 1.17 is released! - The Go Programming Language. (2021/08/16) 2023年3月6日閲覧。.
- ^ Go 1.16 Release Notes - The Go Programming Language. (2021/02/16) 2023年3月6日閲覧。.
- ^ Go 1.16 is released! - The Go Programming Language. (2021/02/16) 2023年3月6日閲覧。.
- ^ Go 1.15 Release Notes - The Go Programming Language. (2020/08/11) 2023年3月12日閲覧。.
- ^ Go 1.15 is released! - The Go Programming Language. (2020/08/11) 2023年3月12日閲覧。.
- ^ Go 1.14 Release Notes - The Go Programming Language. (2020/02/25) 2023年3月12日閲覧。.
- ^ Go 1.14 is released! - The Go Programming Language. (2020/02/25) 2023年3月12日閲覧。.
- ^ Go 1.13 Release Notes - The Go Programming Language. (2019/09/03) 2023年3月12日閲覧。.
- ^ Go 1.13 is released! - The Go Programming Language. (2019/09/03) 2023年3月12日閲覧。.
- ^ Go 1.12 Release Notes - The Go Programming Language. (2019/02/25) 2024年11月13日閲覧。.
- ^ Go 1.12 is released! - The Go Programming Language. (2019/02/25) 2024年11月13日閲覧。.
- ^ Go 1.11 Release Notes - The Go Programming Language. (2018/08/24) 2024年11月13日閲覧。.
- ^ Go 1.11 is released! - The Go Programming Language. (2018/08/24) 2024年11月13日閲覧。.
- ^ Go 1.10 Release Notes - The Go Programming Language. (2018/02/16) 2025年5月20日閲覧。.
- ^ Go 1.10 is released - The Go Programming Language. (2018/02/16) 2025年5月20日閲覧。.
- ^ “Go 1.9 Release Notes - The Go Programming Language”. 2025年5月20日閲覧。
- ^ “Go 1.9 is released - The Go Blog” (2017年8月24日). 2025年5月20日閲覧。
- ^ “Go 1.8 Release Notes - The Go Programming Language”. 2025年5月20日閲覧。
- ^ “Go 1.8 is released - The Go Blog” (2017年2月16日). 2025年5月20日閲覧。
- ^ “Go 1.7 Release Notes - The Go Programming Language”. 2025年5月20日閲覧。
- ^ “Go 1.7 is released - The Go Blog” (2016年8月15日). 2025年5月20日閲覧。
- ^ “Go 1.6 Release Notes - The Go Programming Language”. 2025年6月29日閲覧。
- ^ “Go 1.6 is released - The Go Blog” (2016年2月17日). 2025年6月29日閲覧。
- ^ “Go 1.5 Release Notes - The Go Programming Language”. 2025年6月29日閲覧。
- ^ “Go 1.5 is released - The Go Blog” (2015年8月19日). 2025年6月29日閲覧。
- ^ Go 1.4 Release Notes - The Go Programming Language. (2014/12/10) 2025年5月20日閲覧。.
- ^ Go 1.4 is released - The Go Programming Language. (2014/12/10) 2025年5月20日閲覧。.
- ^ Go 1.3 Release Notes - The Go Programming Language. (2014/06/18) 2025年5月19日閲覧。.
- ^ Go 1.3 is released - The Go Programming Language. (2014/06/18) 2025年5月19日閲覧。.
- ^ Go 1.2 Release Notes - The Go Programming Language. (2013/12/01) 2025年5月20日閲覧。.
- ^ Go 1.2 is released - The Go Programming Language. (2013/12/01) 2025年5月20日閲覧。.
- ^ Go 1.1 Release Notes - The Go Programming Language. (2013/05/13) 2025年5月19日閲覧。.
- ^ Go 1.1 is released - The Go Programming Language. (2013/05/13) 2025年5月19日閲覧。.
- ^ Go 1.3 Release Notes - The Go Programming Language. (2012/03/28) 2025年5月19日閲覧。.
- ^ Go 1.0 is released - The Go Programming Language. (2012/03/28) 2025年5月19日閲覧。.
参考文献
[編集]- The Go Programming Language Specification. The Go website. (JJune 13, 2024).
下位階層のページ
[編集]- &^
- 0
- 0.0
- :=
- =
- Cross-package inlining
- Cのif-elseのエラーパターン解消に関するGoの選択
- EBNF
- Goのコードでgoのバージョンを調べる方法
- Goのプログラムがどんなアセンブリにコンパイルされるか?
- Goコンパイラの変遷
- HTTP
- Hypot
- Keywords
- Mid-stack inlining
- Predeclared identifiers
- Size class
- Standard library
- Standard library/errors
- Standard library/fmt
- Standard library/os
- Zero value
- analysis
- any
- append
- bool
- break
- byte
- cap
- case
- cgoでGoのコードからCの関数を利用する
- chan
- clear
- close
- comparable
- complex
- complex128
- complex64
- const
- continue
- copy
- core type
- default
- defer
- defer,panicとrecover
- delete
- else
- else if
- error
- fallthrough
- false
- flag
- float32
- float64
- for
- func
- go
- go.mod
- go.work
- gofmtコマンド
- goto
- goコマンド
- goコマンド/bug
- goコマンド/build
- goコマンド/clean
- goコマンド/doc
- goコマンド/env
- goコマンド/fix
- goコマンド/fix/any
- goコマンド/fix/bloop
- goコマンド/fix/buildtag
- goコマンド/fix/errorsastype
- goコマンド/fix/fmtappendf
- goコマンド/fix/forvar
- goコマンド/fix/hostport
- goコマンド/fix/inline
- goコマンド/fix/mapsloop
- goコマンド/fix/minmax
- goコマンド/fix/newexpr
- goコマンド/fix/omitzero
- goコマンド/fix/plusbuild
- goコマンド/fix/rangeint
- goコマンド/fix/reflecttypefor
- goコマンド/fix/slicescontains
- goコマンド/fix/slicessort
- goコマンド/fix/stditerators
- goコマンド/fix/stringsbuilder
- goコマンド/fix/stringscut
- goコマンド/fix/stringscutprefix
- goコマンド/fix/stringsseq
- goコマンド/fix/testingcontext
- goコマンド/fix/waitgroup
- goコマンド/fmt
- goコマンド/generate
- goコマンド/get
- goコマンド/help
- goコマンド/install
- goコマンド/list
- goコマンド/mod
- goコマンド/run
- goコマンド/telemetry
- goコマンド/test
- goコマンド/tool
- goコマンド/tool/addr2line
- goコマンド/tool/asm
- goコマンド/tool/cgo
- goコマンド/tool/compile
- goコマンド/tool/covdata
- goコマンド/tool/covdata/debugdump
- goコマンド/tool/covdata/func
- goコマンド/tool/covdata/intersect
- goコマンド/tool/covdata/merge
- goコマンド/tool/covdata/percent
- goコマンド/tool/covdata/pkglist
- goコマンド/tool/covdata/subtract
- goコマンド/tool/covdata/textfmt
- goコマンド/tool/cover
- goコマンド/tool/dist
- goコマンド/tool/link
- goコマンド/tool/nm
- goコマンド/tool/objdump
- goコマンド/tool/pack
- goコマンド/tool/pprof
- goコマンド/tool/preprofile
- goコマンド/tool/test2json
- goコマンド/tool/trace
- goコマンド/version
- goコマンド/vet
- goコマンド/vet/appends
- goコマンド/vet/asmdecl
- goコマンド/vet/assign
- goコマンド/vet/atomic
- goコマンド/vet/bools
- goコマンド/vet/buildtag
- goコマンド/vet/cgocall
- goコマンド/vet/composites
- goコマンド/vet/copylocks
- goコマンド/vet/defers
- goコマンド/vet/directive
- goコマンド/vet/errorsas
- goコマンド/vet/framepointer
- goコマンド/vet/hostport
- goコマンド/vet/httpresponse
- goコマンド/vet/ifaceassert
- goコマンド/vet/loopclosure
- goコマンド/vet/lostcancel
- goコマンド/vet/nilfunc
- goコマンド/vet/printf
- goコマンド/vet/shift
- goコマンド/vet/sigchanyzer
- goコマンド/vet/slog
- goコマンド/vet/stdmethods
- goコマンド/vet/stdversion
- goコマンド/vet/stringintconv
- goコマンド/vet/structtag
- goコマンド/vet/testinggoroutine
- goコマンド/vet/tests
- goコマンド/vet/timeformat
- goコマンド/vet/unmarshal
- goコマンド/vet/unreachable
- goコマンド/vet/unsafeptr
- goコマンド/vet/unusedresult
- goコマンド/vet/waitgroup
- goコマンド/work
- goコマンド/work/init
- if
- imag
- import
- int
- int16
- int32
- int64
- int8
- interface
- iota
- iter.Seq版エラトステネスの篩
- len
- make
- map
- max
- min
- named type
- new
- nil
- os/Args
- package
- panic
- println
- range
- real
- recover
- return
- rune
- select
- string
- struct
- switch
- true
- type
- type literal
- uint
- uint16
- uint32
- uint64
- uint8
- uintptr
- underlying type
- var
- イテレータ
- エラー
- キーワードと宣言済み識別子
- クロスコンパイル
- コードギャラリー
- ジェネリクス
- ソースコードの表現方法
- パッケージ
- ファイル入出力
- ブロック・宣言とスコープ
- プログラムの初期化と実行
- ポインタ
- マップ
- メソッド
- メソッドとインターフェース
- メソッドチェイン
- メモリアロケータ
- ユーザー定義型の配列とスライス
- 並行処理
- 主要な標準インターフェース
- 修飾子不要なインライン関数展開
- 再帰的関数呼出し
- 型
- 型と値の特性
- 変数
- 字句的要素
- 定数と変数
- 実行の方法
- 宣言済型
- 宣言済定数
- 宣言済識別子
- 宣言済関数
- 式
- 改廃された技術
- 数リテラルの精度と型
- 文
- 文法の概要
- 条件分岐と繰り返し
- 構造体
- 標準ライブラリー
- 環境構築
- 算術演算と数学関数
- 識別子のスコープ
- 配列とスライス
- 配列とスライスとエスケープ解析
- 関数

