Goの歴史
本連載では、筆者
Goは2009年にGoogleによって公開されたプログラミング言語です。2012年にGo1として正式公開されました。2022年現在では、GoogleやNetflixをはじめとする海外企業だけはなく、筆者の所属するメルカリなど国内の企業でも多く用いられるようになってきました。海外のGoの導入事例は公式サイトのケーススタディで確認できます。国内企業の導入事例はGoの公式Wikiに掲載があります。これらを見るとスタートアップからメガベンチャー、大企業までさまざまなフェーズの企業、また、CtoCからBtoBまで、さまざまな業種・
筆者はGo1リリース前の2011年ごろからGoの学習を始め、10年ほど国内のGoコミュニティの運営に携わってきました。筆者の記憶では、2014年ごろには国内でもプロダクト開発にGoを利用していた企業があり、2016年ごろから導入企業が増えてきた印象があります。2022年現在では、導入企業の多種多様さをみると、Goはプロダクト開発になくてはならない言語になってきていると言っても良いでしょう。
Goが多くの企業で導入されている理由はいったいどこにあるのでしょう。筆者は、次のような理由があると考えています。
- 開発がしやすい
- パフォーマンスが良いコードが書きやすい
- コミュニティの存在
Goがなぜ開発されたのかという情報は、2012年と少し古い記事ですがGoの最初の設計者の1人であるRob Pike氏が書いたGo at Google: Language Design in the Service of Software Engineeringや2022年に公開されたGoチーム
Goが開発された理由は大きくわけて、開発のスケールと
Goは世界各地にコミュニティがあり、コミュニティとGoチームが共に協力しながら発展していきました。たとえば、Goチームが発明したインポートパスとgo getコマンドのアイデアは、誰もがインターネット上に自由にライブラリやツールを公開できるようにしました。Goエンジニアは自分たちが開発・
Goコミュニティは、Go ConferenceやGopherConなどの大規模カンファレンスや中小規模の勉強会
Goのリリースサイクルと安定性
2012年にGo1がリリースされたときに、Go1.
後方互換の保証は、Goを導入する企業にとっても重要です。Goはバージョンアップの度にランタイムや実行時のパフォーマンス改善を行ってきています。Goのバージョンアップはベネフィットが高いため積極的に行っていきたいところですが、バージョンアップによって製品開発に支障をきたすと本末転倒になってしまいます。後方互換とそこからくる安定性によって、Goはバージョンアップ時に既存コードのデグレなどがほとんど起こりません。
公式Wikiにあるように、Goは年に2回、2月と8月に新しいバージョンをリリースします。執筆時点の最新バージョンである1.
Go1.
このように、Goは安定して利用できるように工夫して保守されています。単に言語機能を増やすのではなく、必要性や安定性、当初のGoが開発された目的である2つのスケーラビリティが崩れないかよくコミュニティで議論された上でアップデートされます。もちろん、コンパイラやランタイムの改善により、生成するコードのパフォーマンスの向上も行っています。
これまでのGo
Go1がリリースされて以来、多くの機能が開発され導入されてきました。特にgo get、モジュール、コンテキスト、ジェネリクスなどは開発者に大きな影響を与えました。
go getはビルドに必要なリソースを取得するコマンドです。Go1のリリース当初では、GOPATH以下にライブラリやコマンドラインツール
Go1リリースより前からGoの動向を追っていた筆者にとってgo getは革新的な機能でした。Go1がリリースされる前は、makeコマンドを使ってソースコードをビルドしており、依存関係もMakefileに記述する必要がありました。インポートパスにGitHubなどのソースコードを管理しているVCS
go getは革新的な機能でしたが、解決していない問題もありました。それは依存ライブラリのバージョン管理です。Go1.
Goの特徴の1つに並行処理があります。並行処理を行う上で難しいのは、正しくすべてのゴルーチンを終了させることです。うまく終了させないとリークが発生してしまいます。Go1.
2022年3月にリリースされたGo1.
これからのGo
2022年8月にGo1.
型エイリアスに型パラメータを使用できるように
1つめは、型エイリアスに型パラメータが使用できるようにする変更
type StringKeyMap[V any] map[string]V
しかし、StringKeyMap[int]
型とmap[string]int
型は別の型になってしまい扱いが面倒です。そこで次のように型エイリアスを利用するとStringKeyMap[int]
型はmap[string]int
型のエイリアスと解釈されるため、同じ型になります。同じ型であれば、型変換
type StringKeyMap[V any] = map[string]V
x/exp/slicesパッケージやx/exp/mapsパッケージの標準パッケージへの取り込み
2つめは、x/
パッケージやx/
パッケージの標準パッケージへの取り込みです。これらのパッケージは十分実用性もあり、取り込まれる可能性は高いですが、必ずしも今
イテレータインタフェース、iter.
型は次のような定義が提案されており、このインタフェースを満たすとfor range
文を使った繰り返し処理に利用できるとされています。なお、Go1.for range
文に利用できます。
package iter
type Iter[E any] interface {
Next() (elem E, ok bool)
}
この提案が承認され、リリースされると次のようにdatabase/Stop
メソッドやRange
メソッドなどリソースの開放についても言及されています。for range
文を利用することで、リソースの開放を自動で行ってくれるようになると便利です。
rows, err := db.QueryContext(ctx, "SELECT name FROM users WHERE age=?", age)
if err != nil { /* エラー処理 */ }
for user := range rows {
// 1レコードあたりの処理
}
イテレータインタフェースの議論は始まったばかりです。筆者はGo1.
Go公式の脆弱性管理システム
3つめは、Go公式の脆弱性管理システムです。すでにドキュメントはGo公式のセキュリティに関するページに記載されています。作業中
脆弱性管理システムは、脆弱性データベースやそのクライアント、静的解析ツール
静的解析を行うvulncheck API は、脆弱性のあるモジュールを利用しているかソースコードまたはバイナリを解析します。ソースコードの解析では静的単一代入
おわりに
本稿ではGoのこれまでとこれからについて紹介しました。Goは2つのスケーラビリティを高めるために開発され、安定して利用できるように配慮されています。しかし、コミュニティからの要望を軽視している訳ではなく、年に2回の開発者向けのアンケート調査や機能提案を受け付けることで利用者が本当に必要としている機能や改善を行うようにしています。
プログラミング言語としての機能追加だけではなく、セキュリティなどのGoを開発する上でのエコシステムの改善にも取り組まれています。新しい機能や改善については、Goを利用する誰もが参加できます。各地域にあるGoコミュニティや一般社団法人Gophers Japanが主催するGo Conferenceやリリースパーティ
本連載を通してもGoの今アツい話について触れていきます。どうぞ楽しみにしていてください。