[インデックス 17526] ファイルの概要
このコミットは、Go 1.2のリリースノートである doc/go1.2.html
ファイルに対する更新です。主にGo 1.2の導入部分と、言語仕様の変更点(nilポインタの扱いと3インデックススライス)に関する記述が追加・修正されています。また、godoc
ツールと vet
ツールの移動、encoding/json
および encoding/xml
パッケージのマイナーな変更についても触れられています。
コミット
commit 6cbc5387c30b7358d930c10f465c70c16357fd36
Author: Rob Pike <r@golang.org>
Date: Tue Sep 10 15:13:45 2013 +1000
doc/go1.2.html: introduction, language changes
R=golang-dev, remyoudompheng, dominik.honnef, adg
CC=golang-dev
https://golang.org/cl/13341049
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/6cbc5387c30b7358d930c10f465c70c16357fd36
元コミット内容
doc/go1.2.html: introduction, language changes
このコミットは、Go 1.2のリリースノートドキュメント doc/go1.2.html
の「Introduction」セクションと「Changes to the language」セクションを更新するものです。
変更の背景
Go言語は、Go 1.0のリリース(2012年3月)以降、言語とライブラリの安定性を重視してきました。Go 1.1(2013年4月)では、互換性を維持しつつも、パフォーマンス向上に焦点を当てた大幅な改善が行われました。
このコミットが行われたGo 1.2のリリースは、Go 1.1から約6ヶ月後という短い期間で行われました。これは、リリースプロセスをより効率的にするためのスケジュール短縮の一環です。そのため、Go 1.0から1.1への変更ほど大規模ではありませんが、スケジューラの改善や新しい言語機能の追加など、いくつかの重要な開発が含まれています。
このコミットの主な目的は、Go 1.2のリリースに伴い、ユーザーがGo 1.2で導入される変更点、特に言語仕様の変更(nilポインタの扱いと3インデックススライス)について正確な情報を得られるように、公式ドキュメントを更新することです。特にnilポインタの変更は、既存の誤ったコードに影響を与える可能性があるため、その詳細な説明が求められました。
前提知識の解説
Go言語のバージョン管理と互換性
Go言語は、Go 1のリリース以降、Go 1 Compatibility Promise を掲げています。これは、Go 1の仕様に準拠して書かれたプログラムは、将来のGoのバージョンでも動作し続けることを保証するものです。このコミットでも、「Go 1.2は互換性の約束を守る」と明記されており、既存のほとんどのプログラムは変更なしで動作するとされています。ただし、nilポインタの変更のように、既存の「誤った」コードがパニックを引き起こすようになるケースも存在します。
スライス (Slices)
Goのスライスは、配列の一部を参照する軽量なデータ構造です。スライスは、[low:high]
の形式で作成され、low
から high-1
までの要素を含みます。スライスには「長さ (length)」と「容量 (capacity)」という2つの重要なプロパティがあります。
- 長さ (length): スライスに含まれる要素の数。
len(s)
で取得できます。 - 容量 (capacity): スライスの基盤となる配列の、スライスの開始位置から数えた残りの要素数。
cap(s)
で取得できます。スライスは、その容量の範囲内で再スライス(reslice)することで、長さを変更できます。
nilポインタ (nil Pointers)
Goにおける nil
は、ポインタ、スライス、マップ、チャネル、インターフェース、関数などのゼロ値です。nil
ポインタは、何も指し示していないポインタを意味します。Go 1.2以前では、特定の状況下で nil
ポインタを介した不正なメモリアクセスが発生する可能性がありましたが、Go 1.2でその挙動が厳格化されました。
godoc
と go.tools
サブリポジトリ
godoc
は、Goのソースコードからドキュメントを生成し、HTTPサーバーとして提供するツールです。Goの標準ディストリビューションに含まれていましたが、このコミットの時点で go.tools
サブリポジトリに移動されました。go.tools
は、Goのツール群を開発・管理するための独立したリポジトリです。これにより、ツールの更新がGo本体のリリースサイクルに縛られずに行えるようになり、また、ツールのコアロジックがライブラリとして提供されることで、カスタムツールの構築が容易になりました。
技術的詳細
nilポインタの厳格化
Go 1.2では、nilポインタの安全性が強化されました。以前のGo 1.0では、以下のようなコードで nil
ポインタ x
を介して不正なメモリアクセスが可能でした。
type T struct {
X [1<<24]byte // 非常に大きな配列
Field int32
}
func main() {
var x *T // x は nil
// ...
// x.Field にアクセスしようとすると、xがnilでも、
// コンパイラがFieldのオフセットを計算し、
// 1<<24 のアドレスにアクセスしようとする可能性があった。
// これはnilポインタのデリファレンスではないため、パニックしないことがあった。
}
Go 1.2では、このような nil
ポインタを介した間接参照(indirection)は、必ずランタイムパニックを引き起こすことが保証されるようになりました。これは、配列へのnilポインタ、nilインターフェース値、nilスライスなど、あらゆる種類のnil値に対する間接参照に適用されます。この変更の意図は、不正なメモリアクセスを防ぎ、プログラムの安全性を高めることです。コンパイラは、この挙動を強制するために、コンパイルされたプログラムに追加のテストを挿入する場合があります。
この変更は、既存の「誤った」コード(nilポインタのデリファレンスがパニックしないことに依存していたコード)をパニックさせる可能性があるため、互換性の約束の「例外」として扱われます。
3インデックススライス (Three-index slices)
Go 1.2では、スライス操作に容量(capacity)を指定できる3インデックススライス構文が導入されました。従来の array[low:high]
形式では、スライスの長さ(high - low
)のみを指定できましたが、新しい array[low:high:max]
形式では、スライスの容量(max - low
)も明示的に指定できます。
例:
var array [10]int
slice := array[2:4] // 長さ: 2 (4-2), 容量: 8 (10-2)
新しい構文:
slice = array[2:4:6] // 長さ: 2 (4-2), 容量: 4 (6-2)
この例では、slice
の長さは2のままですが、容量は4に制限されます。これにより、この新しいスライス値を使って元の配列の最後の2つの要素(インデックス6と7)にアクセスすることは不可能になります。
3インデックススライスは、スライスの容量を意図的に制限したい場合に有用です。例えば、基盤となる配列の特定の部分だけを公開し、それ以外の部分へのアクセスを防ぎたい場合などに使用できます。この変更は、既存のプログラムに影響を与えない後方互換性のある変更です。
godoc
および vet
ツールの go.tools
サブリポジトリへの移動
godoc
と vet
は、Go開発者が日常的に使用する重要なツールです。これらのツールのソースコードがGo本体のリポジトリから go.tools
サブリポジトリへ移動されました。この変更の主な理由は以下の通りです。
- 独立した開発サイクル:
go.tools
に移動することで、これらのツールはGo本体のリリースサイクルとは独立して開発・更新できるようになります。これにより、ツールの改善や新機能の追加がより迅速に行えるようになります。 - ライブラリとしての提供: ツールのコア機能がライブラリとして提供されることで、他のプロジェクトやカスタムツールからこれらの機能を再利用しやすくなります。
- ディストリビューションの簡素化: バイナリディストリビューションには引き続きこれらのツールが含まれるため、エンドユーザーへの影響は最小限に抑えられます。ソースからビルドするユーザーは、
go get
コマンドを使用してこれらのツールをインストールする必要があります。
encoding/json
および encoding/xml
の変更
encoding/json
:Marshal
関数が、アンパサンド (&
) を常に\u0026
としてエスケープするようになりました。また、以前は拒否されていた不正なUTF-8シーケンスも受け入れ、修正するようになりました。これにより、JSONの生成とパースの堅牢性が向上します。encoding/xml
:UnMarshaler
のスペルミスがUnmarshaler
に修正されました。これはドキュメント上の修正であり、機能的な変更ではありません。
コアとなるコードの変更箇所
このコミットは、Go 1.2のリリースノートドキュメントである doc/go1.2.html
ファイルのみを変更しています。
--- a/doc/go1.2.html
+++ b/doc/go1.2.html
@@ -7,67 +7,128 @@
<h2 id="introduction">Introduction to Go 1.2</h2>
<p>
-+<font color=red>
- RED TEXT IS FROM THE 1.1 DOC AND NEEDS TO BE UPDATED. (It is here for
- formatting and style reference.)
--<p>
--<font color=red>
--The release of <a href="/doc/go1.html">Go version 1</a> (Go 1 or Go 1.0 for short)
--in March of 2012 introduced a new period
--of stability in the Go language and libraries.
--That stability has helped nourish a growing community of Go users
--and systems around the world.
--Several "point" releases since
--then—1.0.1, 1.0.2, and 1.0.3—have been issued.
--These point releases fixed known bugs but made
--no non-critical changes to the implementation.
-</font>
-</p>
-
-<p>
--<font color=red>
--This new release, Go 1.1, keeps the <a href="/doc/go1compat.html">promise
--of compatibility</a> but adds a couple of significant
--(backwards-compatible, of course) language changes, has a long list
--of (again, compatible) library changes, and
--includes major work on the implementation of the compilers,
--libraries, and run-time.
--The focus is on performance.
--Benchmarking is an inexact science at best, but we see significant,
--sometimes dramatic speedups for many of our test programs.
--We trust that many of our users' programs will also see improvements
--just by updating their Go installation and recompiling.
--</font>
-+Since the release of <a href="/doc/go1.1.html">Go version 1.1</a> in April, 2013,
-+the release schedule has been shortened to make the release process more efficient.
-+This release, Go version 1.2 or Go 1.2 for short, arrives roughly six months after 1.1,
-+while 1.1 took over a year to appear after 1.0.
-+Because of the shorter time scale, 1.2 is a smaller delta than the step from 1.0 to 1.1,
-+but it still has some significant developments, including
-+a better scheduler and one new language feature.
-+Of course, Go 1.2 keeps the <a href="/doc/go1compat.html">promise
-+of compatibility</a>.
-+The overwhelming majority of programs built with Go 1.1 (or 1.0 for that matter)
-+will run without any changes whatsoever when moved to 1.2,
-+although the introduction of one restriction
-+to a corner of the language may expose already-incorrect code
-+(see the discussion of the <a href="#use_of_nil">use of nil</a>).
-</p>
-
-+<h2 id="language">Changes to the language</h2>
-+
<p>
--<font color=red>
--This document summarizes the changes between Go 1 and Go 1.2.
--Very little if any code will need modification to run with Go 1.1,
--although a couple of rare error cases surface with this release
--and need to be addressed if they arise.
--Details appear below; see the discussion of XXX.
--</font>
-+In the interest of firming up the specification, one corner case has been clarified,
-+with consequences for programs.
-+There is also one new language feature.
-</p>
-
-<h2 id="language">Changes to the language</h2>
-+<h3 id="use_of_nil">Use of nil</h3>
-
<p>
--<font color=red>
--<a href="/doc/go1compat.html">The Go compatibility document</a> promises
--that programs written to the Go 1 language specification will continue to operate,
--and those promises are maintained.
--In the interest of firming up the specification, though, there are
--details about some error cases that have been clarified.
--There are also some new language features.
--</font>
-+The language now specifies that, for safety reasons,
-+certain uses of nil pointers are guaranteed to trigger a run-time panic.
-+For instance, in Go 1.0, given code like
-</p>
-
-+<pre>
-+type T struct {
-+ X [1<<24]byte
-+ Field int32
-+}
-+
-+func main() {
-+ var x *T
-+ ...
-+}
-</pre>
-+
-+<p>
-+the <code>nil</code> pointer <code>x</code> could be used to access memory incorrectly:
-+the expression <code>x.Field</code> could access memory at address <code>1<<24</code>.
-+To prevent such unsafe behavior, in Go 1.2 the compilers now guarantee that any indirection through
-+a nil pointer, such as illustrated here but also in nil pointers to arrays, nil interface values,
-+nil slices, and so on, will either panic or return a correct, safe non-nil value.
-+In short, any expression that explicitly or implicitly requires evaluation of a nil address is an error.
-+The implementation may inject extra tests into the compiled program to enforce this behavior.
-</p>
-+
-+<p>
-+Further details are in the
-+<a href="http://golang.org/s/go12nil">design document</a>.
-</p>
-+
-+<p>
-+<em>Updating</em>:
-+Most code that depended on the old behavior is erroneous and will fail when run.
-+Such programs will need to be updated by hand.
-</p>
-+
-+<h3 id="three_index">Three-index slices</h3>
-+
-+<p>
-+Go 1.2 adds the ability to specify the capacity as well as the length when using a slicing operation
-+on an existing array or slice.
-+A slicing operation creates a new slice by describing a contiguous section of an already-created array or slice:
-</p>
-+
-+<pre>
-+var array [10]int
-+slice := array[2:4]
-</pre>
-+
-+<p>
-+The capacity of the slice is the maximum number of elements that the slice may hold, even after reslicing;
-+it reflects the size of the underlying array.
-+In this example, the capacity of the <code>slice</code> variable is 8.
-</p>
-+
-+<p>
-+Go 1.2 adds new syntax to allow a slicing operation to specify the capacity as well as the length.
-+A second
-+colon introduces the capacity value, which must be less than or equal to the capacity of the
-+source slice or array, adjusted for the origin. For instance,
-</p>
-
-<h3 id="threeindex">Three-index slices</h3>
-+<pre>
-+slice = array[2:4:6]
-</pre>
-+
-+<p>
-+sets the slice to have the same length as in the earlier example but its capacity is now only 4 elements (6-2).
-+It is impossible to use this new slice value to access the last two elements of the original array.
-</p>
-
<p>
--cmd/gc: three-index slicing to set cap as well as length (CL 10743046).
-+In this three-index notation, a missing first index (<code>[:i:j]</code>) defaults to zero but the other
-+two indices must always be specified explicitly.
-+It is possible that future releases of Go may introduce default values for these indices.
-</p>
-+
-+<p>
-+Further details are in the
-+<a href="http://golang.org/s/go12slice">design document</a>.
-</p>
-+
-+<p>
-+<em>Updating</em>:
-+This is a backwards-compatible change that affects no existing programs.
-</p>
<h2 id="impl">Changes to the implementations and tools</h2>
@@ -81,6 +142,45 @@ go/build: support including C++ code with cgo (CL 8248043).\n </li>\n </ul>\n \n+<h3 id="go_tools_godoc">Godoc moved to the go.tools subrepository</h3>\n+\n+<p>\n+A binary is still included with the distribution, but the source code for the\n+<code>godoc</code> command has moved to the\n+<a href="http://code.google.com/p/go.tools">go.tools</a> subrepository.\n+The core of the program has been split into a\n+<a href="https://code.google.com/p/go/source/browse/?repo=tools#hg%2Fgodoc">library</a>,\n+while the command itself is in a separate\n+<a href="https://code.google.com/p/go/source/browse/?repo=tools#hg%2Fcmd%2Fgodoc">directory</a>.\n+The move allows the code to be updated easily and the separation into a library and command\n+makes it easier to construct custom binaries for local sites and different deployment methods.\n+</p>\n+\n+<p>\n+<em>Updating</em>:\n+Since godoc was not part of the library,\n+no client code depends on the godoc sources and no updating is required.\n+</p>\n+\n+<p>\n+The binary distributions available from <a href="http://golang.org>golang.org</a>\n+include a godoc binary, so users of these distributions are unaffected.\n+</p>\n+\n+<p>\n+When building from source, users must use "go get" to install godoc.\n+</p>\n+\n+<pre>\n+$ go get code.google.com/p/go.tools/cmd/godoc\n+</pre>\n+\n+<h3 id="go_tools_vet">The vet tool moved to the go.tools subrepository</h3>\n+\n+<p>\n+TODO\n+</p>\n+\n <h3 id="gccgo">Status of gccgo</h3>\n \n <p>\n@@ -90,7 +190,7 @@ The GCC release schedule does not coincide with the Go release schedule, so some\n The 4.8.0 version of GCC shipped in March, 2013 and includes a nearly-Go 1.1 version of <code>gccgo</code>.\n Its library is a little behind the release, but the biggest difference is that method values are not implemented.\n Sometime around July 2013, we expect 4.8.2 of GCC to ship with a <code>gccgo</code>\n--providing a complete Go 1.1 implementaiton.\n++providing a complete Go 1.1 implementation.\n </font>\n </p>\n \n@@ -228,11 +328,11 @@ archive/tar,archive/zip: fix os.FileInfo implementation to provide base name onl\n </li>\n \n <li>\n--fmt: indexed access to arguments in Printf etc. (CL 9680043).\n-+encoding: new package defining generic encoding interfaces (CL 12541051).\n-</li>\n-\n-<li>\n--encoding: new package defining generic encoding interfaces (CL 12541051).\n-+fmt: indexed access to arguments in Printf etc. (CL 9680043).\n+fmt: indexed access to arguments in Printf etc. (CL 9680043).\n </li>\n \n <li>\n@@ -247,43 +347,6 @@ text/template: allow {{\"{{\"}}else if ... {{\"}}\"}} to simplify if chains (CL 1332\n </li>\n </ul>\n \n-<h3 id="exp_old">Exp and old subtrees moved to go.exp and go.text subrepositories</h3>\n-\n-<p>\n-<font color=red>\n-To make it easier for binary distributions to access them if desired, the <code>exp</code>\n-and <code>old</code> source subtrees, which are not included in binary distributions,\n-have been moved to the new <code>go.exp</code> subrepository at\n-<code>code.google.com/p/go.exp</code>. To access the <code>ssa</code> package,\n-for example, run\n-</font>\n-</p>\n-\n-<h3 id="new_packages">New packages</h3>\n-\n-<p>\n-<font color=red>\n-There are three new packages.\n-</font>\n-</p>\n-\n-<ul>\n-<li>\n-<font color=red>\n-The <a href="/pkg/go/format/"><code>go/format</code></a> package provides\n-a convenient way for a program to access the formatting capabilities of the\n-<a href="/cmd/go/#hdr-Run_gofmt_on_package_sources"><code>go fmt</code></a> command.\n-It has two functions,\n-<a href="/pkg/go/format/#Node"><code>Node</code></a> to format a Go parser\n-<a href="/pkg/go/ast/#Node"><code>Node</code></a>,\n-and\n-<a href="/pkg/go/format/#Source"><code>Source</code></a>\n-to reformat arbitrary Go source code into the standard format as provided by the\n-<a href="/cmd/go/#hdr-Run_gofmt_on_package_sources"><code>go fmt</code></a> command.\n-</font>\n-</li>\n-</ul>\n-\n <h3 id="minor_library_changes">Minor changes to the library</h3>\n \n <p>\n@@ -404,7 +467,7 @@ described above.\n \n <li>\n The <a href="/pkg/encoding/json/"><code>encoding/json</code></a> package\n--now will alway escape ampersands as "\\u0026" when printing strings.\n-+now will always escape ampersands as "\\u0026" when printing strings.\n+now will always escape ampersands as "\\u0026" when printing strings.\n It will now accept but correct invalid UTF-8 in\n <a href="/pkg/encoding/json/#Marshal"><code>Marshal</code></a>\n (such input was previously rejected).\n@@ -420,7 +483,7 @@ It also supports the generic encoding interfaces of the\n <a href="/pkg/encoding/"><code>encoding</code></a> package\n described above through the new\n <a href="/pkg/encoding/xml/#Marshaler"><code>Marshaler</code></a>,\n--<a href="/pkg/encoding/xml/#UnMarshaler"><code>UnMarshaler</code></a>,\n-+<a href="/pkg/encoding/xml/#Unmarshaler"><code>Unmarshaler</code></a>,\n+<a href="/pkg/encoding/xml/#Unmarshaler"><code>Unmarshaler</code></a>,\n and related\n <a href="/pkg/encoding/xml/#MarshalerAttr"><code>MarshalerAttr</code></a> and\n <a href="/pkg/encoding/xml/#UnmarshalerAttr"><code>UnmarshalerAttr</code></a>\n```
## コアとなるコードの解説
このコミットは、Go 1.2のリリースノートドキュメント `doc/go1.2.html` の内容を更新するものです。具体的なコードの変更ではなく、ドキュメントのテキストコンテンツの変更が中心です。
主な変更点は以下の通りです。
1. **導入部分の更新**:
* Go 1.1からのリリーススケジュールの短縮(約6ヶ月)について言及し、Go 1.0から1.1への変更よりも小規模なデルタであると説明しています。
* Go 1.2には「より良いスケジューラ」と「新しい言語機能」が含まれることを強調しています。
* Go 1互換性の約束が維持されていることを再確認しつつ、「nilの使用」に関する新しい制限が既存の誤ったコードを露呈させる可能性があることを警告しています。
2. **言語変更点の追加**:
* **Use of nil (nilの使用)**:
* nilポインタの特定の利用が、安全上の理由からランタイムパニックを引き起こすことが保証されるようになったことを説明しています。
* Go 1.0での不正なメモリアクセスの例(大きな配列を持つ構造体のnilポインタを介したフィールドアクセス)を挙げ、Go 1.2ではこのような挙動がパニックを引き起こすように変更されたことを示しています。
* 「明示的または暗黙的にnilアドレスの評価を必要とするあらゆる式はエラーである」と明確に述べています。
* この変更に依存していたほとんどのコードは誤りであり、手動での更新が必要であると注意を促しています。
* 詳細な設計ドキュメントへのリンク `http://golang.org/s/go12nil` が追加されています。
* **Three-index slices (3インデックススライス)**:
* 既存の配列またはスライスに対してスライス操作を行う際に、長さだけでなく容量も指定できるようになったことを説明しています。
* 新しい構文 `array[low:high:max]` を導入し、`max` が容量を決定することを示しています。
* 例として `slice = array[2:4:6]` を挙げ、これによりスライスの容量が制限され、元の配列の特定の要素にアクセスできなくなることを説明しています。
* この変更は後方互換性があり、既存のプログラムには影響しないことを明記しています。
* 詳細な設計ドキュメントへのリンク `http://golang.org/s/go12slice` が追加されています。
3. **実装とツールの変更点の更新**:
* **Godoc moved to the go.tools subrepository**: `godoc` コマンドのソースコードが `go.tools` サブリポジトリに移動されたことを説明しています。バイナリディストリビューションには引き続き含まれるが、ソースからビルドする場合は `go get code.google.com/p/go.tools/cmd/godoc` でインストールする必要があることを示しています。
* **The vet tool moved to the go.tools subrepository**: `vet` ツールも同様に `go.tools` サブリポジトリに移動されたことが記載されています(ただし、ドキュメント上は「TODO」とされています)。
* **gccgo Status**: `gccgo` のGo 1.1実装に関する最新情報が更新されています。
4. **マイナーなライブラリ変更点の更新**:
* `encoding/json` パッケージの `Marshal` が、アンパサンドを常に `\u0026` としてエスケープし、不正なUTF-8も受け入れて修正するようになったことが記載されています。
* `encoding/xml` パッケージの `UnMarshaler` のスペルが `Unmarshaler` に修正されています。
このコミットは、Go 1.2の重要な変更点をユーザーに伝えるための公式ドキュメントの更新であり、Go言語の進化と安定性への取り組みを示すものです。
## 関連リンク
* Go 1.2 Release Notes (公式ドキュメント): このコミットが更新しているドキュメントそのもの。Go 1.2のリリース時に公開された最終版を参照すると、このコミットの内容がどのように反映されたかを確認できます。
* Go 1 Compatibility Promise: [https://go.dev/doc/go1compat](https://go.dev/doc/go1compat)
* Go 1.2 nilポインタの設計ドキュメント: [http://golang.org/s/go12nil](http://golang.org/s/go12nil)
* Go 1.2 3インデックススライスの設計ドキュメント: [http://golang.org/s/go12slice](http://golang.org/s/go12slice)
* `go.tools` サブリポジトリ: [https://code.google.com/p/go.tools](https://code.google.com/p/go.tools) (現在は [https://go.googlesource.com/tools](https://go.googlesource.com/tools) に移行)
## 参考にした情報源リンク
* コミットデータファイル: `./commit_data/17526.txt`
* GitHub上のコミットページ: [https://github.com/golang/go/commit/6cbc5387c30b7358d930c10f465c70c16357fd36](https://github.com/golang/go/commit/6cbc5387c30b7358d930c10f465c70c16357fd36)
* Go 1.2 Release Notes (最終版): [https://go.dev/doc/go1.2](https://go.dev/doc/go1.2) (このコミットの変更が反映された後の公式ドキュメント)
* Go 1.2 nilポインタの設計ドキュメント (Go issue): [https://go.dev/issue/5992](https://go.dev/issue/5992) (Go 1.2 nilポインタの挙動変更に関する議論)
* Go 1.2 3インデックススライスの設計ドキュメント (Go issue): [https://go.dev/issue/5993](https://go.dev/issue/5993) (Go 1.2 3インデックススライスに関する議論)
* Go 1.2 Release Notes (Go Blog): [https://go.dev/blog/go1.2](https://go.dev/blog/go1.2) (Go 1.2リリースに関する公式ブログ記事)
* Go 1.1 Release Notes: [https://go.dev/doc/go1.1](https://go.dev/doc/go1.1) (Go 1.1からの変更点を理解するための比較対象)
* Go 1 Release Notes: [https://go.dev/doc/go1](https://go.dev/doc/go1) (Go 1の互換性約束の背景)
* Go Slices: usage and internals: [https://go.dev/blog/slices](https://go.dev/blog/slices) (Goスライスの基本的な概念と内部構造に関する公式ブログ記事)
* Go nil: [https://go.dev/doc/effective_go#nil](https://go.dev/doc/effective_go#nil) (Effective Goにおけるnilの解説)
* Go tools repository: [https://go.googlesource.com/tools](https://go.googlesource.com/tools) (godocやvetのソースコードが格納されているリポジトリ)