[インデックス 11816] ファイルの概要
このコミットでは、doc/go1.html と doc/go1.tmpl の2つのファイルが変更されています。これらはGo言語のバージョン1に関するドキュメントファイルであり、特にGo 1のリリースノートや変更点を記述している部分に該当します。
コミット
- コミットハッシュ:
aee1c38cda006e652e2589b6bbf16db0e6095a29 - Author: Rob Pike r@golang.org
- Date: Mon Feb 13 08:05:53 2012 +1100
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/aee1c38cda006e652e2589b6bbf16db0e6095a29
元コミット内容
go1: fix old reference to Sys method
The example was fixed; the simplifying rewrite was missed.
R=golang-dev
CC=golang-dev
https://golang.org/cl/5651080
変更の背景
このコミットは、Go言語のバージョン1(Go 1)のリリースに向けたドキュメントの修正です。具体的には、os.FileStat 型の Sys メソッドの呼び出し方に関する古い記述がドキュメント内に残っていたため、それを修正することが目的です。
Go言語の初期のバージョンでは、os.FileInfo インターフェース(そしてそれを実装する os.FileStat 構造体)の Sys メソッドは、interface{} 型を返すことが一般的でした。この interface{} 型の戻り値は、基盤となるオペレーティングシステム固有のファイルシステム情報を含む構造体(例えばUnix系システムでは syscall.Stat_t)を保持していました。
しかし、Go 1のリリースプロセスにおいて、Sys メソッドの利用方法が簡素化された可能性があります。元のドキュメントの例では、fi.(*os.FileStat).Sys.(*syscall.Stat_t).Ino のように、os.FileStat への型アサーションと、その結果得られる Sys メソッドの戻り値に対する syscall.Stat_t への型アサーションの二段階が必要でした。
このコミットのメッセージにある「The example was fixed; the simplifying rewrite was missed.」という記述は、おそらくGo 1の変更で Sys メソッドが直接 Sys() のように呼び出せるようになり、その戻り値が直接 *syscall.Stat_t のような具体的な型を返すようになったか、あるいは Sys メソッド自体が os.FileStat のポインタレシーバではなく値レシーバになったことで、fi.(*os.FileStat) のような中間的な型アサーションが不要になったことを示唆しています。
つまり、ドキュメントの例がGo 1の新しいAPIの利用方法に合わせて更新されていなかったため、このコミットで修正が行われました。これは、APIの変更に伴うドキュメントの追従という、ソフトウェア開発において非常に一般的な作業です。
前提知識の解説
このコミットを理解するためには、以下のGo言語の概念と関連するシステムコールに関する知識が必要です。
-
os.FileInfoインターフェース: Go言語のosパッケージで定義されているインターフェースで、ファイルやディレクトリに関する抽象的な情報(名前、サイズ、パーミッション、更新時刻など)を提供します。os.Stat関数やos.Lstat関数がこのインターフェースを実装した値を返します。 -
os.FileStat構造体:os.FileInfoインターフェースを実装する具体的な構造体の一つです。通常、os.Statなどによって返されるos.FileInfoの実体は、このos.FileStat型のインスタンスです。 -
Sys()メソッド:os.FileInfoインターフェースに定義されているメソッドの一つで、基盤となるオペレーティングシステム固有のファイルシステム情報を返します。このメソッドの戻り値はinterface{}型であり、具体的な型はOSによって異なります。例えば、Unix系システムでは*syscall.Stat_t型の値を、Windowsでは*syscall.Win32FileAttributeData型の値を保持していることがあります。 -
syscall.Stat_t構造体:syscallパッケージで定義されている構造体で、Unix系システムにおけるstatシステムコールが返すファイル情報をGo言語で表現したものです。この構造体には、ファイルのi-node番号 (Ino)、デバイスID (Dev)、パーミッション (Mode)、リンク数 (Nlink)、所有者UID/GID (Uid,Gid)、サイズ (Size)、最終アクセス時刻 (Atim)、最終変更時刻 (Mtim)、最終i-node変更時刻 (Ctim) など、詳細なファイルメタデータが含まれます。 -
型アサーション (
Type Assertion): Go言語の機能の一つで、インターフェース型の変数が保持している具体的な型を調べたり、その具体的な型に変換したりするために使用されます。構文はvalue.(Type)です。例えば、var i interface{} = "hello"の場合、s := i.(string)とすることでiが文字列型であることを確認し、sにその値を代入できます。もし型が一致しない場合はパニックが発生します。安全に型アサーションを行うには、value, ok := i.(Type)のように二つの戻り値を受け取る形式を使用します。このコミットの変更前では、
fi.(*os.FileStat)のようにos.FileInfo型のfiを*os.FileStat型にアサートし、さらにその結果に対してSys()メソッドを呼び出し、その戻り値(interface{}型)を*syscall.Stat_t型にアサートするという、二段階の型アサーションが必要でした。
技術的詳細
このコミットの技術的なポイントは、Go言語のAPI設計における簡素化と、それに伴うドキュメントの更新の重要性です。
変更前のコード例 fi.(*os.FileStat).Sys.(*syscall.Stat_t).Ino は、以下のステップでファイルのi-node番号 (Ino) を取得しようとしていました。
fiはos.FileInfoインターフェース型の変数です。fi.(*os.FileStat):fiが実際に*os.FileStat型の値を保持していることを確認し、その型にアサートします。これにより、os.FileStat型の具体的なメソッド(この場合はSysメソッド)を呼び出す準備ができます。.Sys:*os.FileStat型の値に対してSysメソッドを呼び出します。このメソッドはinterface{}型の値を返します。.( *syscall.Stat_t):Sysメソッドが返したinterface{}型の値が、実際に*syscall.Stat_t型のポインタであることを確認し、その型にアサートします。.Ino:*syscall.Stat_t型のポインタからInoフィールドにアクセスし、i-node番号を取得します。
この一連の操作は、Go言語の型システムとインターフェースの柔軟性を示すものですが、同時に冗長性も伴います。特に、os.FileInfo の実装が os.FileStat であることがほとんどの場合に自明であるならば、fi.(*os.FileStat) のような中間的な型アサーションは不要であると判断されることがあります。
このコミットの変更は、fi.(*os.FileStat).Sys.(*syscall.Stat_t).Ino から fi.Sys().(*syscall.Stat_t).Ino への変更です。これは、os.FileInfo インターフェースの Sys メソッドが、os.FileStat のような具体的な実装型に型アサートすることなく、直接呼び出せるようになったことを示しています。
考えられる変更の理由はいくつかあります。
Sys()メソッドのレシーバの変更:os.FileStatのSysメソッドが、ポインタレシーバ ((f *FileStat) Sys() interface{}) から値レシーバ ((f FileStat) Sys() interface{}) に変更された可能性があります。インターフェースのメソッドは、そのインターフェースを実装する型が値レシーバを持つメソッドを定義している場合、値とポインタの両方でそのインターフェースを満たすことができます。しかし、ポインタレシーバを持つメソッドの場合、そのインターフェースを満たすのはポインタ型のみです。もしos.FileStatのSysメソッドが値レシーバになった場合、os.FileInfo型のfiがos.FileStatの値型を保持している場合でも、直接fi.Sys()を呼び出すことが可能になります。- コンパイラの最適化または言語仕様の変更: Go 1のリリースに向けて、コンパイラがインターフェースのメソッド呼び出しをより賢く処理するようになったか、あるいは言語仕様の微妙な変更により、特定の状況下で中間的な型アサーションが不要になった可能性も考えられます。しかし、これは可能性としては低いでしょう。
- ドキュメントの誤り: 最も単純なケースとして、元々
fi.Sys().(*syscall.Stat_t).Inoが正しい記述であったにもかかわらず、ドキュメントの例が誤っていたという可能性もゼロではありません。しかし、コミットメッセージの「simplifying rewrite was missed」という表現から、APIの簡素化があったと考えるのが自然です。
いずれにせよ、この変更はGo言語のAPIがより直感的で簡潔になったことを示しており、それに応じてドキュメントも最新の状態に保つ必要があったということです。
コアとなるコードの変更箇所
--- a/doc/go1.html
+++ b/doc/go1.html
@@ -1461,7 +1461,7 @@ the i-number expression could be contracted to
</p>
<pre>
- fi.(*os.FileStat).Sys.(*syscall.Stat_t).Ino
+ fi.Sys().(*syscall.Stat_t).Ino
</pre>
<p>
--- a/doc/go1.tmpl
+++ b/doc/go1.tmpl
@@ -1364,7 +1364,7 @@ the i-number expression could be contracted to
</p>
<pre>
- fi.(*os.FileStat).Sys.(*syscall.Stat_t).Ino
+ fi.Sys().(*syscall.Stat_t).Ino
</pre>
<p>
コアとなるコードの解説
変更は doc/go1.html と doc/go1.tmpl の両方で行われています。これらはGo 1のドキュメントを生成するためのソースファイルと、その結果生成されるHTMLファイルです。
両ファイルにおいて、以下の行が変更されています。
- 変更前:
fi.(*os.FileStat).Sys.(*syscall.Stat_t).Ino - 変更後:
fi.Sys().(*syscall.Stat_t).Ino
この変更の核心は、fi.(*os.FileStat) という部分が削除されたことです。
-
変更前:
fiがos.FileInfoインターフェース型である場合、その具体的な実装が*os.FileStatであることを明示的に型アサートしてからSysメソッドを呼び出していました。これは、os.FileInfoインターフェース自体にはSysメソッドが定義されているものの、そのメソッドが返すinterface{}型の値をさらに*syscall.Stat_tにアサートするためには、一度*os.FileStatにアサートしてSysメソッドを呼び出すという手順が必要だったことを示唆しています。あるいは、単に冗長な記述であった可能性もあります。 -
変更後:
fi.Sys()と直接呼び出しています。これは、fiがos.FileInfoインターフェース型である場合でも、そのインターフェースがSys()メソッドを直接提供しており、その戻り値がinterface{}型であることを前提としています。そして、そのinterface{}型の戻り値を(*syscall.Stat_t)に型アサートしてInoフィールドにアクセスしています。
この変更は、Go 1のAPIがより簡潔になり、os.FileInfo インターフェースから直接 Sys() メソッドを呼び出すことが推奨されるようになったことを反映しています。これにより、コードの可読性が向上し、不必要な型アサーションが削減されます。
関連リンク
-
Go 1 Release Notes (Go 1の公式リリースノート): Go 1のリリースノートには、APIの変更点や互換性に関する情報が詳細に記載されています。このコミットの背景にあるAPIの簡素化に関する記述が見つかる可能性があります。 https://go.dev/doc/go1
-
osパッケージのドキュメント: Go言語のosパッケージの公式ドキュメントは、os.FileInfoインターフェースやSys()メソッドの現在の定義と使用方法を理解する上で不可欠です。 https://pkg.go.dev/os -
syscallパッケージのドキュメント:syscallパッケージの公式ドキュメントは、syscall.Stat_t構造体の詳細や、システムコールに関するGo言語のインターフェースを理解するのに役立ちます。 https://pkg.go.dev/syscall
参考にした情報源リンク
-
コミットメッセージと差分情報: この解説の主要な情報源は、提供されたコミットメッセージと差分情報です。 https://github.com/golang/go/commit/aee1c38cda006e652e2589b6bbf16db0e6095a29
-
Go言語の公式ドキュメント:
osパッケージ、syscallパッケージ、Go 1リリースノートなど、Go言語の公式ドキュメントは、関連するAPIの動作と歴史的背景を理解するために参照しました。 https://go.dev/doc/ -
Go言語の型アサーションに関する一般的な情報: Go言語の型アサーションの概念は、この変更を理解する上で基礎となる知識です。 https://go.dev/tour/methods/15 (Go Tourの型アサーションのセクションなど) https://go.dev/blog/laws-of-reflection (Go言語のリフレクションに関するブログ記事も関連する概念を説明しています)
[インデックス 11816] ファイルの概要
このコミットは、Go言語の公式ドキュメントの一部である doc/go1.html と doc/go1.tmpl の2つのファイルを修正しています。これらのファイルは、Go 1のリリースに関する情報や変更点を記述しており、特にGo言語の標準ライブラリである os パッケージの FileInfo インターフェースの Sys メソッドの利用例に関する記述が修正の対象となっています。
コミット
- コミットハッシュ:
aee1c38cda006e652e2589b6bbf16db0e6095a29 - Author: Rob Pike r@golang.org
- Date: Mon Feb 13 08:05:53 2012 +1100
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/aee1c38cda006e652e2589b6bbf16db0e6095a29
元コミット内容
go1: fix old reference to Sys method
The example was fixed; the simplifying rewrite was missed.
R=golang-dev
CC=golang-dev
https://golang.org/cl/5651080
変更の背景
このコミットは、Go言語のバージョン1(Go 1)のリリースに向けて、ドキュメント内の古いコード例を修正することを目的としています。具体的には、os.FileInfo インターフェースの Sys メソッドの呼び出し方に関する記述が、Go 1のAPIの変更に追従していなかったため、これを更新しています。
Go言語では、ファイルやディレクトリの情報を抽象的に扱うために os.FileInfo インターフェースが提供されています。このインターフェースには Sys() メソッドが含まれており、これは基盤となるオペレーティングシステム固有のファイルシステム情報(例えば、Unix系システムにおけるi-node番号など)を interface{} 型として返します。この interface{} 型の戻り値は、通常、syscall パッケージで定義されているOS固有の構造体(例: syscall.Stat_t)に型アサートして利用されます。
コミットメッセージにある「The example was fixed; the simplifying rewrite was missed.」という記述は、Go 1のAPI設計において Sys メソッドの利用方法が簡素化されたにもかかわらず、ドキュメントの例がその変更を反映していなかったことを示唆しています。変更前のドキュメントの例では、fi.(*os.FileStat).Sys.(*syscall.Stat_t).Ino のように、os.FileInfo 型の変数 fi を一度 *os.FileStat 型に型アサートしてから Sys メソッドを呼び出し、さらにその戻り値を *syscall.Stat_t に型アサートするという、二段階の型アサーションが必要でした。
このコミットは、この冗長な fi.(*os.FileStat) の部分を削除し、fi.Sys().(*syscall.Stat_t).Ino という、より直接的な呼び出し方に修正することで、ドキュメントのコード例をGo 1の新しい、より簡潔なAPIの利用方法に合わせることを目的としています。これは、APIの進化に伴うドキュメントの正確性を保つための重要なメンテナンス作業です。
前提知識の解説
このコミットの変更を深く理解するためには、以下のGo言語の概念と関連するシステムプログラミングの知識が必要です。
-
os.FileInfoインターフェース: Go言語のosパッケージで定義されているインターフェースで、ファイルやディレクトリのメタデータ(ファイル名、サイズ、パーミッション、最終更新時刻など)を抽象的に表現します。os.Statやos.Lstatといった関数がこのインターフェースを実装した値を返します。 -
os.FileStat構造体:os.FileInfoインターフェースの具体的な実装の一つです。通常、os.Statなどによって返されるos.FileInfoの実体は、このos.FileStat型のインスタンスです。 -
Sys()メソッド:os.FileInfoインターフェースに定義されているメソッドで、基盤となるオペレーティングシステム固有のファイルシステム情報を返します。このメソッドの戻り値はinterface{}型(Go 1.18以降はany型)であり、その具体的な内容はOSによって異なります。例えば、Unix系システムでは*syscall.Stat_t型のポインタ、Windowsでは*syscall.Win32FileAttributeData型のポインタなどが返されます。このメソッドは、os.FileInfoが提供する一般的な情報では不足する場合に、より低レベルなOS固有のファイル情報を取得するために使用されます。 -
syscall.Stat_t構造体:syscallパッケージで定義されている構造体で、Unix系システムにおけるstat(2)システムコールが返すファイル情報をGo言語で表現したものです。この構造体には、ファイルのi-node番号 (Ino)、デバイスID (Dev)、パーミッション (Mode)、リンク数 (Nlink)、所有者UID/GID (Uid,Gid)、サイズ (Size)、タイムスタンプ(アクセス、変更、i-node変更)など、詳細なファイルメタデータが含まれます。 -
型アサーション (
Type Assertion): Go言語の機能の一つで、インターフェース型の変数が実際にどのような具体的な型の値を保持しているかを調べ、その具体的な型に変換するために使用されます。構文はvalue.(Type)です。例えば、var i interface{} = "hello"というインターフェース変数iがある場合、s := i.(string)とすることで、iが文字列型であることを確認し、その値をsに代入できます。型アサーションは、インターフェースの抽象性を保ちつつ、必要に応じて具体的な型の振る舞いにアクセスするために不可欠な機能です。このコミットの変更前では、
fi.(*os.FileStat)のようにos.FileInfo型のfiを*os.FileStat型にアサートし、さらにその結果に対してSys()メソッドを呼び出し、その戻り値(interface{}型)を*syscall.Stat_t型にアサートするという、二段階の型アサーションが行われていました。
技術的詳細
このコミットの技術的な核心は、Go言語のAPI設計における「簡潔さ」と「直感性」の追求、そしてそれに伴うドキュメントの正確性の維持です。
変更前のコード例 fi.(*os.FileStat).Sys.(*syscall.Stat_t).Ino は、以下のステップでファイルのi-node番号 (Ino) を取得しようとしていました。
fiはos.FileInfoインターフェース型の変数です。fi.(*os.FileStat):fiが*os.FileStat型の値を保持していることを明示的に型アサートします。これは、os.FileInfoインターフェースのSysメソッドを呼び出す前に、具体的なos.FileStat型のインスタンスにアクセスする必要があるという前提に基づいています。.Sys:*os.FileStat型の値に対してSysメソッドを呼び出します。このメソッドはinterface{}型の値を返します。.( *syscall.Stat_t):Sysメソッドが返したinterface{}型の値が、実際に*syscall.Stat_t型のポインタであることを確認し、その型にアサートします。.Ino:*syscall.Stat_t型のポインタからInoフィールドにアクセスし、i-node番号を取得します。
この一連の操作は、Go言語の型システムとインターフェースの柔軟性を示していますが、特に os.FileInfo の実装がほとんどの場合 os.FileStat であることを考えると、fi.(*os.FileStat) のような中間的な型アサーションは冗長であると判断されることがあります。
このコミットによる変更は、fi.(*os.FileStat).Sys.(*syscall.Stat_t).Ino から fi.Sys().(*syscall.Stat_t).Ino への修正です。この変更は、fi.(*os.FileStat) の部分が削除されたことを意味します。
この簡素化がなぜ可能になったのか、いくつかの可能性が考えられます。
os.FileInfoインターフェースのSys()メソッドの直接呼び出し: 最も可能性が高いのは、os.FileInfoインターフェース自体がSys()メソッドを定義しており、そのメソッドがos.FileStatの具体的な実装に依存することなく、直接呼び出せるようになった、あるいは元々そうであったがドキュメントの例が誤っていたというケースです。os.FileInfoインターフェースの定義にSys() interface{}が含まれているため、os.FileInfo型の変数から直接Sys()を呼び出すことは可能です。Sys()メソッドのレシーバの変更:os.FileStatのSysメソッドが、ポインタレシーバ ((f *FileStat) Sys() interface{}) から値レシーバ ((f FileStat) Sys() interface{}) に変更された可能性も考えられます。インターフェースのメソッドは、そのインターフェースを実装する型が値レシーバを持つメソッドを定義している場合、値とポインタの両方でそのインターフェースを満たすことができます。しかし、ポインタレシーバを持つメソッドの場合、そのインターフェースを満たすのはポインタ型のみです。もしos.FileStatのSysメソッドが値レシーバになった場合、os.FileInfo型のfiがos.FileStatの値型を保持している場合でも、直接fi.Sys()を呼び出すことが可能になります。- Goコンパイラの進化: Go 1のリリースに向けて、コンパイラがインターフェースのメソッド呼び出しをより効率的かつ柔軟に処理するようになった可能性も考えられます。これにより、以前は必要だった明示的な型アサーションが不要になったのかもしれません。
いずれにせよ、この変更はGo言語のAPIがより直感的で簡潔になったことを示しており、それに応じてドキュメントも最新の状態に保つ必要があったということです。これは、Go言語が「シンプルさ」と「実用性」を重視する設計哲学を持っていることの表れでもあります。
コアとなるコードの変更箇所
--- a/doc/go1.html
+++ b/doc/go1.html
@@ -1461,7 +1461,7 @@ the i-number expression could be contracted to
</p>
<pre>
- fi.(*os.FileStat).Sys.(*syscall.Stat_t).Ino
+ fi.Sys().(*syscall.Stat_t).Ino
</pre>
<p>
--- a/doc/go1.tmpl
+++ b/doc/go1.tmpl
@@ -1364,7 +1364,7 @@ the i-number expression could be contracted to
</p>
<pre>
- fi.(*os.FileStat).Sys.(*syscall.Stat_t).Ino
+ fi.Sys().(*syscall.Stat_t).Ino
</pre>
<p>
コアとなるコードの解説
変更は doc/go1.html と doc/go1.tmpl の両方のファイルに対して行われています。これらのファイルは、Go 1の公式ドキュメントを構成するHTMLとテンプレートファイルであり、Go言語の機能やAPIの使用例を説明する役割を担っています。
両ファイルにおいて、以下のコードスニペットが修正されています。
- 変更前:
fi.(*os.FileStat).Sys.(*syscall.Stat_t).Ino - 変更後:
fi.Sys().(*syscall.Stat_t).Ino
この変更の最も重要な点は、fi.(*os.FileStat) という部分が削除されたことです。
-
変更前 (
fi.(*os.FileStat).Sys.(*syscall.Stat_t).Ino): この記述は、fiがos.FileInfoインターフェース型の変数である場合に、まずその具体的な型が*os.FileStatであることを明示的に型アサートしています。これにより、os.FileStat型の具体的なメソッドであるSys()を呼び出す準備をしています。その後、Sys()メソッドの戻り値(interface{}型)を*syscall.Stat_t型に型アサートし、最終的にInoフィールドにアクセスしています。この形式は、os.FileInfoインターフェースから直接Sys()を呼び出すことができない、あるいは推奨されないという前提に基づいていた可能性があります。 -
変更後 (
fi.Sys().(*syscall.Stat_t).Ino): この記述では、fiがos.FileInfoインターフェース型である場合、直接Sys()メソッドを呼び出しています。これは、os.FileInfoインターフェース自体がSys()メソッドを定義しており、そのメソッドがos.FileStatのような具体的な実装型に型アサートすることなく、直接呼び出せることを示しています。Sys()メソッドの戻り値は依然としてinterface{}型であるため、それを*syscall.Stat_tに型アサートしてInoフィールドにアクセスする部分は変更されていません。
この修正は、Go 1のAPIがより簡潔になり、os.FileInfo インターフェースから直接 Sys() メソッドを呼び出すことが可能になった、あるいはそれがより推奨されるようになったことを反映しています。これにより、コードの可読性が向上し、不必要な型アサーションが削減され、Go言語の「シンプルさ」という設計哲学がより明確に示されています。
関連リンク
-
Go 1 Release Notes: Go 1の公式リリースノートは、このコミットの背景にあるAPIの変更や簡素化に関する詳細な情報を提供している可能性があります。 https://go.dev/doc/go1
-
osパッケージのドキュメント: Go言語のosパッケージの公式ドキュメントは、os.FileInfoインターフェースやSys()メソッドの現在の定義と使用方法を理解するために不可欠です。 https://pkg.go.dev/os -
syscallパッケージのドキュメント:syscallパッケージの公式ドキュメントは、syscall.Stat_t構造体の詳細や、Go言語におけるシステムコールへのインターフェースを理解するのに役立ちます。 https://pkg.go.dev/syscall
参考にした情報源リンク
-
コミットメッセージと差分情報: この解説の主要な情報源は、提供されたコミットメッセージと差分情報です。 https://github.com/golang/go/commit/aee1c38cda006e652e2589b6bbf16db0e6095a29
-
Go言語の公式ドキュメント:
osパッケージ、syscallパッケージ、Go 1リリースノートなど、Go言語の公式ドキュメントは、関連するAPIの動作と歴史的背景を理解するために参照しました。 https://go.dev/doc/ -
Go言語の型アサーションに関する一般的な情報: Go言語の型アサーションの概念は、この変更を理解する上で基礎となる知識です。 https://go.dev/tour/methods/15 (Go Tourの型アサーションのセクションなど)
-
Web検索結果:
os.FileStatのSysメソッドに関する一般的な情報や、その戻り値がinterface{}型であること、OS固有のデータを提供することなどを確認するためにWeb検索を利用しました。 https://dev.to/ (関連するGo言語のブログ記事など) https://golinuxcloud.com/ (関連するGo言語のブログ記事など) https://go.dev/ (Go言語の公式ドキュメントやブログ記事など) https://github.com/ (Go言語のリポジトリ内の関連コードなど) https://googlesource.com/ (Go言語のソースコードリポジトリなど)