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

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

このコミットは、Go言語の公式ドキュメント doc/go1.1.html に対して行われた変更です。具体的には、net パッケージの ResolveTCPAddr 関数におけるネットワーク名の検証に関する重要な変更点について、ユーザーへの警告を追加するものです。Go 1.0 と Go 1.1 での net パッケージの挙動の違い、特にエラーチェックの厳格化について説明が加えられています。

コミット

commit 014137c839a3b9c5b9a2f44df8c8598e2569a311
Author: Russ Cox <rsc@golang.org>
Date:   Mon Dec 10 18:08:07 2012 -0500

    doc/go1.1.html: add warning about net.ResolveTCPAddr error checking
    
    Suggested by Paul Borman.
    
    R=golang-dev, mikioh.mikioh
    CC=golang-dev
    https://golang.org/cl/6930043

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

https://github.com/golang/go/commit/014137c839a3b9c5b9a2f44df8c8598e2569a311

元コミット内容

このコミットは、doc/go1.1.html ファイルに net.ResolveTCPAddr のエラーチェックに関する警告を追加するものです。Paul Bormanによって提案されました。

変更の背景

Go 1.1 のリリースに伴い、net パッケージ内のプロトコル固有のリゾルバ(ResolveTCPAddr, ResolveIPAddr, ResolveUDPAddr, ResolveUnixAddr など)の挙動が変更されました。Go 1.0 では、これらの関数に無効なネットワーク名(例: ResolveTCPAddr"tcp", "tcp4", "tcp6" 以外の文字列)が渡された場合でも、エラーを返さずに黙って受け入れてしまうという「寛容な」実装になっていました。

しかし、これはドキュメントに記載されている期待される挙動と異なり、開発者が意図しないネットワーク名を使用しても気づきにくいという問題がありました。Go 1.1 では、この挙動が修正され、ドキュメントに明記されている有効なネットワーク名以外の文字列が渡された場合には、明示的にエラーを返すように変更されました。

このコミットは、この重要な変更点をGo 1.1のリリースノートに追記することで、既存のGo 1.0コードをGo 1.1に移行する開発者が、この挙動変更によって発生しうる潜在的なバグや予期せぬエラーに備えられるようにするためのものです。特に、Go 1.0で無効なネットワーク名を渡してもエラーにならなかったコードが、Go 1.1ではエラーを返すようになるため、既存のアプリケーションが動作しなくなる可能性がありました。この警告は、そのような互換性の問題を事前に開発者に知らせることを目的としています。

前提知識の解説

Go言語の net パッケージ

Go言語の標準ライブラリには、ネットワークI/O機能を提供する net パッケージが含まれています。このパッケージは、TCP/IP、UDP/IP、Unixドメインソケットなど、様々なネットワークプロトコルを扱うための機能を提供します。

net.ResolveTCPAddr 関数

net.ResolveTCPAddr は、指定されたネットワークとアドレス文字列に対応するTCPアドレス(*TCPAddr)を解決するために使用される関数です。そのシグネチャは通常以下のようになります。

func ResolveTCPAddr(network, address string) (*TCPAddr, error)
  • network: 使用するネットワークプロトコルを指定します。"tcp", "tcp4" (IPv4のみ), "tcp6" (IPv6のみ) などが有効な値です。
  • address: 解決するアドレス文字列です。例: "localhost:8080", "127.0.0.1:80", "[::1]:443" など。

この関数は、成功すると *TCPAddr を返し、エラーが発生した場合は error を返します。

Go 1.0 と Go 1.1 の互換性

Go言語は、後方互換性を非常に重視して設計されています。しかし、時にはバグ修正や設計上の改善のために、既存の挙動が変更されることがあります。このような変更は、特に以前のバージョンで「誤った」挙動をしていた部分を修正する際に発生しがちです。

このケースでは、Go 1.0の net.ResolveTCPAddr が、ドキュメントに反して無効な network 引数を受け入れてしまっていたという「バグ」に近い挙動をしていました。Go 1.1での修正は、この「バグ」を修正し、ドキュメント通りの厳格なエラーチェックを行うようにしたものです。これは、より堅牢なアプリケーション開発を促進するための変更ですが、同時にGo 1.0でこの「寛容な」挙動に依存していたコードにとっては、互換性の問題を引き起こす可能性があります。

リゾルバの役割

ネットワークプログラミングにおいて、リゾルバ(Resolver)は、人間が読みやすい形式のアドレス(例: ドメイン名やホスト名)を、コンピュータが理解できる形式のネットワークアドレス(例: IPアドレスとポート番号)に変換する役割を担います。ResolveTCPAddr のような関数は、この解決プロセスの一部として機能します。

技術的詳細

このコミットが追加するドキュメントの変更は、Go 1.1における net パッケージのプロトコル固有のリゾルバの挙動変更を明確にしています。

具体的には、以下の点が強調されています。

  1. ネットワーク名の厳格な検証: Go 1.0では、ResolveTCPAddrnetwork 引数に \"tcp\", \"tcp4\", \"tcp6\" 以外の文字列が渡されても、エラーを返さずに処理を続行していました。Go 1.1では、これらの有効な文字列以外が渡された場合、関数はエラーを返すようになります。
  2. 他のリゾルバへの影響: この変更は ResolveTCPAddr だけでなく、ResolveIPAddr, ResolveUDPAddr, ResolveUnixAddr といった他のプロトコル固有のリゾルバにも同様に適用されます。これらの関数も、Go 1.1からは無効なネットワーク名に対してエラーを返すようになります。

この変更の技術的な意味合いは以下の通りです。

  • 堅牢性の向上: 以前は黙って受け入れられていた無効な入力がエラーとして扱われるようになるため、アプリケーションの堅牢性が向上します。開発者は、不正なネットワーク名が使用された場合に早期に問題を検知できるようになります。
  • ドキュメントとの整合性: 関数の実際の挙動がドキュメントの記述と一致するようになります。これにより、開発者はドキュメントを信頼してコードを書くことができます。
  • 既存コードへの影響: Go 1.0で、意図せず無効なネットワーク名を渡していたコードは、Go 1.1にアップグレードすると実行時エラーが発生する可能性があります。これは、特にテストが不十分なレガシーコードや、ネットワーク名の生成ロジックにバグがあった場合に顕著になります。開発者は、Go 1.1への移行時にこれらのリゾルバの呼び出し箇所をレビューし、適切なネットワーク名が渡されていることを確認する必要があります。
  • エラーハンドリングの重要性: この変更は、Go言語におけるエラーハンドリングの重要性を改めて示しています。Goでは、エラーは戻り値として明示的に返されるため、呼び出し側は常にエラーをチェックし、適切に処理する責任があります。今回の変更は、以前はエラーにならなかったケースがエラーになることで、既存のエラーハンドリングロジックが適切に機能するかどうかの再確認を促します。

このドキュメントの追加は、Go 1.1へのスムーズな移行を支援し、開発者が潜在的な互換性の問題を事前に認識し、対処できるようにするための重要な情報提供です。

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

このコミットは、doc/go1.1.html ファイルに以下のHTMLスニペットを追加しています。

--- a/doc/go1.1.html
+++ b/doc/go1.1.html
@@ -72,6 +72,19 @@ calls the debug/elf functions Symbols or ImportedSymbols may need to be
 adjusted to account for the additional symbol and the change in symbol offsets.
 </p>
 
+<h3 id="net">net</h3>
+
+<p>
+The protocol-specific resolvers were formerly
+lax about the network name passed in. For example, although the documentation was clear
+that the only valid networks for <code>ResolveTCPAddr</code> are <code>"tcp"</code>,
+<code>"tcp4"</code>, and <code>"tcp6"</code>, the Go 1.0 implementation silently accepted
+any string. The Go 1.1 implementation returns an error if the network is not one of those strings.
+The same is true of the other protocol-specific resolvers <code>ResolveIPAddr</code>, <code>ResolveUDPAddr</code>, and
+<code>ResolveUnixAddr</code>.
+</p>
+
+
 <h3 id="time">time</h3>
 <p>
 On Linux, previous versions of the time package returned times with

具体的には、doc/go1.1.html<h3 id="net">net</h3> セクションの下に、net パッケージのリゾルバに関する新しい段落が追加されています。

コアとなるコードの解説

追加されたHTMLコードは、Go 1.1のリリースノートの一部として、net パッケージの変更点を説明するものです。

  • <h3 id="net">net</h3>: net パッケージに関するセクションのヘッダーです。
  • <p> タグで囲まれたテキストが、変更の具体的な内容を説明しています。
    • "The protocol-specific resolvers were formerly lax about the network name passed in."
      • これは、以前(Go 1.0)のプロトコル固有のリゾルバが、渡されるネットワーク名に対して「寛容」であったことを示しています。
    • "For example, although the documentation was clear that the only valid networks for ResolveTCPAddr are \"tcp\", \"tcp4\", and \"tcp6\", the Go 1.0 implementation silently accepted any string."
      • ResolveTCPAddr のドキュメントでは \"tcp\", \"tcp4\", \"tcp6\" のみが有効なネットワークとして明記されていたにもかかわらず、Go 1.0の実装では任意の文字列を黙って受け入れていたという具体的な例を挙げています。
    • "The Go 1.1 implementation returns an error if the network is not one of those strings."
      • Go 1.1の実装では、これらの有効な文字列以外がネットワーク名として渡された場合にエラーを返すようになったことを明確に述べています。
    • "The same is true of the other protocol-specific resolvers ResolveIPAddr, ResolveUDPAddr, and ResolveUnixAddr."
      • この変更が ResolveIPAddr, ResolveUDPAddr, ResolveUnixAddr といった他の関連するリゾルバにも同様に適用されることを補足しています。

この追加されたテキストは、Go 1.0からGo 1.1への移行時に開発者が注意すべき重要な互換性に関する情報を提供し、既存のコードが新しいバージョンで予期せぬエラーを発生させないようにするための警告として機能します。

関連リンク

  • Go 1.1 Release Notes (公式ドキュメント): このコミットが追加されたドキュメントの最終版は、Go 1.1の公式リリースノートの一部として公開されています。
  • Go net パッケージのドキュメント:
  • net.ResolveTCPAddr のドキュメント:

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Go言語のGitHubリポジトリ
  • Go言語のリリースノートの歴史
  • Go言語の net パッケージのソースコード (Go 1.0およびGo 1.1の比較)