Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 10293] ファイルの概要

このコミットは、Go言語の標準ライブラリにおけるパッケージ名の変更を反映するためのものです。具体的には、src/pkg/以下のm-zで始まるパッケージ(math/big, mime, net, old, os, path, regexp, runtime, sort, strconv, strings, syscall, testing, text, unicode, websocketなど)に関連する多数のファイルが変更されています。合計87ファイルが変更され、126行が追加され、126行が削除されています。これは主にimportパスの修正によるものです。

コミット

  • コミットハッシュ: 45e3bcb34389808232f61899936731ebacb778ef
  • Author: Rob Pike r@golang.org
  • Date: Tue Nov 8 15:41:54 2011 -0800
  • コミットメッセージ:
    renaming_3: gofix -r go1pkgrename src/pkg/[m-z]*
    
    R=rsc
    CC=golang-dev
    https://golang.org/cl/5345045
    

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/45e3bcb34389808232f61899936731ebacb778ef

元コミット内容

このコミットは、gofix -r go1pkgrename src/pkg/[m-z]*Error flushing log events: Error: getaddrinfo ENOTFOUND play.googleapis.com at GetAddrInfoReqWrap.onlookupall [as oncomplete] (node:dns:120:26) { errno: -3008, code: 'ENOTFOUND', syscall: 'getaddrinfo', hostname: 'play.googleapis.com' } コマンドの実行結果を反映したものです。これは、Go 1リリースに向けた標準ライブラリのパッケージ名の変更(リネーム)に対応するための自動修正であり、特にsrc/pkg/以下のmからzで始まるパッケージに影響を与えています。

変更の背景

Go言語は、2012年3月にGo 1をリリースしました。Go 1の目標の一つは、言語と標準ライブラリの安定した互換性のある基盤を提供することでした。この目標を達成するため、Go 1リリース前には、標準ライブラリのパッケージ構造とAPIに大規模な「クリーンアップ」と再編成が行われました。これには、パッケージのリネームやAPIの変更など、後方互換性のない変更も含まれていました。

このような大規模な変更は、既存のGoコードベースを持つ開発者にとって大きな移行コストを伴います。この問題を軽減するために、Goチームはgofixというツールを開発しました。gofixは、古いGoコードを新しいGo 1の標準に自動的に更新するためのコマンドラインツールです。このコミットは、gofixツールの一部であるgo1pkgrenameという特定のルール(またはリファクタリング)が適用された結果であり、特にパッケージのインポートパスの変更に焦点を当てています。

前提知識の解説

gofixツール

gofixは、Go言語のソースコードを自動的に修正し、新しいGoのバージョンやAPIの変更に適合させるためのコマンドラインユーティリティです。Go 1リリース時に特に重要となり、開発者が既存のコードベースをGo 1互換にするための手間を大幅に削減しました。gofixは、特定の「リファクタリング」ルールを適用することで機能し、このコミットではgo1pkgrenameというルールが使用されています。

go1pkgrename

go1pkgrenameは、gofixツールがGo 1リリースに向けて標準ライブラリのパッケージ名を変更するために使用した特定のリファクタリングルールです。例えば、randパッケージがmath/randに、httpパッケージがnet/httpに移動するなど、多くのパッケージがより論理的な階層構造に再編成されました。go1pkgrenameはこのマッピングを処理し、ソースコード内のimportパスを自動的に更新します。

Goのパッケージ管理

Go言語では、コードはパッケージに整理されます。他のパッケージの機能を使用するには、importステートメントを使用してそのパッケージをインポートする必要があります。Go 1以前は、標準ライブラリのパッケージパスは現在とは異なる構造をしていました。Go 1での再編成は、より明確で予測可能なパッケージ階層を提供することを目的としていました。

Go 1互換性保証

Go 1リリース以降、Goチームは「Go 1互換性保証」を導入しました。これは、Go 1でリリースされたAPIは、将来のGoのバージョンでも互換性が維持されることを意味します。この保証は、Goエコシステムの安定性と長期的な信頼性を確保するために非常に重要です。このコミットで行われたような大規模なパッケージのリネームは、この互換性保証が確立される前の「一度きりの」クリーンアップ作業でした。

技術的詳細

このコミットの技術的詳細は、主にGoのソースコード内のimportステートメントの自動修正にあります。gofix -r go1pkgrenameコマンドは、Goのパーサーを使用してソースファイルを読み込み、抽象構文木(AST)を構築します。その後、go1pkgrenameルールがASTを走査し、古いパッケージパスに対応するimport宣言を見つけます。見つかった場合、そのパスを新しいGo 1の標準ライブラリのパスに書き換えます。

例えば、このコミットでは以下のような変更が多数見られます。

  • import "rand"import "math/rand" に変更
  • import "http"import "net/http" に変更
  • import "url"import "net/url" に変更
  • import "json"import "encoding/json" に変更
  • import "gob"import "encoding/gob" に変更
  • import "exec"import "os/exec" に変更
  • import "template"import "text/template" に変更
  • import "utf8"import "unicode/utf8" に変更
  • import "utf16"import "unicode/utf16" に変更
  • import "rpc"import "net/rpc" に変更

これらの変更は、Goの標準ライブラリがよりモジュール化され、論理的なグループに分けられたことを示しています。例えば、乱数生成に関連する機能はmathパッケージの下に、HTTPに関連する機能はnetパッケージの下に、エンコーディング/デコーディングに関連する機能はencodingパッケージの下に、OS関連の実行機能はosパッケージの下に、テンプレート機能はtextパッケージの下に、Unicode関連の機能はunicodeパッケージの下に、RPC機能はnetパッケージの下にそれぞれ配置されました。

gofixツールは、これらの変更を自動化することで、手動での修正に伴うエラーのリスクを減らし、開発者の移行作業を大幅に簡素化しました。

コアとなるコードの変更箇所

このコミットは、特定の機能追加やバグ修正ではなく、広範囲にわたるインポートパスの修正が中心です。以下に、代表的な変更箇所をいくつか示します。

  1. src/pkg/math/big/int.go:

    --- a/src/pkg/math/big/int.go
    +++ b/src/pkg/math/big/int.go
    @@ -10,7 +10,7 @@ import (
     	"errors"
     	"fmt"
     	"io"
    -	"rand"
    +	"math/rand"
     	"strings"
     )
    

    randパッケージがmath/randに移動したことを示しています。

  2. src/pkg/net/http/cgi/child.go:

    --- a/src/pkg/net/http/cgi/child.go
    +++ b/src/pkg/net/http/cgi/child.go
    @@ -12,14 +12,14 @@ import (
     	"crypto/tls"
     	"errors"
     	"fmt"
    -	"http"
     	"io"
     	"io/ioutil"
     	"net"
    +	"net/http"
    +	"net/url"
     	"os"
     	"strconv"
     	"strings"
    -	"url"
     )
    

    httpパッケージがnet/httpに、urlパッケージがnet/urlに移動したことを示しています。

  3. src/pkg/net/rpc/debug.go:

    --- a/src/pkg/net/rpc/debug.go
    +++ b/src/pkg/net/rpc/debug.go
    @@ -11,9 +11,9 @@ package rpc
    
     import (
     	"fmt"
    -	"http"
    +	"net/http"
     	"sort"
    -	"template"
    +	"text/template"
     )
    

    httpパッケージがnet/httpに、templateパッケージがtext/templateに移動したことを示しています。

  4. src/pkg/old/regexp/regexp.go:

    --- a/src/pkg/old/regexp/regexp.go
    +++ b/src/pkg/old/regexp/regexp.go
    @@ -72,7 +72,7 @@ import (
     	"bytes"
     	"io"
     	"strings"
    -	"utf8"
    +	"unicode/utf8"
     )
    

    utf8パッケージがunicode/utf8に移動したことを示しています。

コアとなるコードの解説

このコミットにおける「コアとなるコードの変更」は、Go言語の標準ライブラリのパッケージ構造をGo 1の最終的な形に合わせるためのインポートパスの修正です。

  • randからmath/randへの変更: 乱数生成機能は数学的な操作と密接に関連しているため、mathパッケージの下に配置されるのがより適切であるという判断がなされました。これにより、Goの標準ライブラリのパッケージ構造がより論理的になりました。
  • httpからnet/httpへの変更: HTTPプロトコルはネットワーク通信のレイヤーに属するため、netパッケージの下に配置されるのが自然です。これにより、ネットワーク関連の機能が一箇所に集約され、見通しが良くなりました。
  • urlからnet/urlへの変更: URLの解析や操作もネットワーク関連の機能であるため、netパッケージの下に移動されました。
  • jsonからencoding/jsonへの変更: JSONエンコーディング/デコーディングは、データエンコーディングの一種であるため、encodingパッケージの下に配置されました。同様にgobencoding/gobに移動しています。これにより、様々なデータ形式のエンコーディング機能がencodingパッケージの下に集約されました。
  • execからos/execへの変更: 外部コマンドの実行はオペレーティングシステム(OS)の機能と密接に関連しているため、osパッケージの下に配置されました。
  • templateからtext/templateへの変更: テンプレートエンジンはテキスト処理の一種であるため、textパッケージの下に配置されました。これにより、テキスト関連のユーティリティがtextパッケージの下に集約されました。
  • utf8からunicode/utf8への変更: UTF-8エンコーディング/デコーディングはUnicode文字セットの処理に関連するため、unicodeパッケージの下に配置されました。同様にutf16unicode/utf16に移動しています。これにより、Unicode関連の機能がunicodeパッケージの下に集約されました。
  • rpcからnet/rpcへの変更: リモートプロシージャコール(RPC)はネットワークを介した通信メカニズムであるため、netパッケージの下に配置されました。

これらの変更は、Go 1のリリースに向けて標準ライブラリのパッケージ構造を整理し、より一貫性のある、理解しやすいものにするための重要なステップでした。gofixツールがこれらの変更を自動化したことで、GoコミュニティはスムーズにGo 1への移行を進めることができました。

関連リンク

参考にした情報源リンク