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

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

このコミットは、Go言語のsyscallパッケージにおけるWindowsビルドの問題を修正するものです。具体的には、src/pkg/syscall/syscall_windows_test.goファイル内のテストコードにおいて、誤った型名と関数名が使用されていたのを修正しています。これにより、Windows環境でのビルドが正常に行われるようになります。

コミット

  • コミットハッシュ: 56f5e6d845fe201cbd58351b610be55ab44c8c1c
  • 作者: Russ Cox rsc@golang.org
  • コミット日時: 2012年6月8日(金)14:04:44 -0400

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

https://github.com/golang/go/commit/56f5e6d845fe201cbd58351b610be55ab44c8c1c

元コミット内容

syscall: fix windows build

TBR=bradfitz
CC=golang-dev
https://golang.org/cl/6303061

変更の背景

このコミットの背景には、Go言語のsyscallパッケージがWindows環境で正しくビルドされないという問題がありました。syscallパッケージは、オペレーティングシステムが提供する低レベルな機能(システムコール)にアクセスするためのGo言語のインターフェースを提供します。Windowsの場合、これはWin32 APIのラッパーとして機能します。

問題は、src/pkg/syscall/syscall_windows_test.go内のテストコードで、Windows APIのファイル検索機能に関連する型と関数が誤って参照されていたことに起因します。具体的には、Win32finddata1という型とFindFirstFile1という関数が使用されていましたが、これらはGoのsyscallパッケージ内で定義されている正しい型や関数名ではありませんでした。この誤った参照が原因で、Windows環境でのコンパイルエラーが発生し、ビルドが失敗していました。

このコミットは、これらの誤った参照を、Goのsyscallパッケージで定義されている正しい型であるsyscall.Win32finddataと、正しい関数であるsyscall.FindFirstFileに修正することで、ビルドエラーを解消し、Windows環境でのsyscallパッケージの正常な動作を保証することを目的としています。

前提知識の解説

Go言語のsyscallパッケージ

Go言語のsyscallパッケージは、オペレーティングシステムが提供する低レベルなプリミティブ(システムコール)へのアクセスを提供します。これにより、ファイル操作、ネットワーク通信、プロセス管理など、OS固有の機能に直接アクセスすることが可能になります。クロスプラットフォーム対応のため、各OS(Linux, macOS, Windowsなど)に特化した実装が含まれています。

Win32 API

Win32 API(Windows API)は、Microsoft Windowsオペレーティングシステム用のアプリケーションを開発するための主要なプログラミングインターフェースです。ファイルシステム、メモリ管理、プロセスとスレッド、グラフィックス、ネットワークなど、Windowsのほぼすべての機能にアクセスするための関数、構造体、マクロのセットを提供します。Goのsyscallパッケージは、Windows上ではこれらのWin32 APIをGoの関数としてラップしています。

WIN32_FIND_DATA構造体

Windows APIには、FindFirstFileFindNextFileといった関数を使用してファイルやディレクトリを検索する際に、見つかったファイルやディレクトリの情報を格納するためのWIN32_FIND_DATAという構造体が存在します。この構造体には、ファイル名、ファイルサイズ、作成日時、最終アクセス日時、最終書き込み日時、ファイル属性などの情報が含まれます。

Go言語のsyscallパッケージでは、このWIN32_FIND_DATA構造体に対応するGoの型としてsyscall.Win32finddataが定義されています。

FindFirstFile関数

Windows APIのFindFirstFile関数は、指定されたパスパターンに一致するファイルまたはディレクトリを検索し、最初に見つかったものの情報を取得するために使用されます。この関数は、検索ハンドル(後続のFindNextFile関数で使用)と、見つかったファイル情報を格納するWIN32_FIND_DATA構造体へのポインタを引数として取ります。

Go言語のsyscallパッケージでは、このFindFirstFile関数に対応するGoの関数としてsyscall.FindFirstFileが定義されています。

StringToUTF16Ptr関数

Windows APIは通常、文字列をUTF-16エンコーディングで扱います。Go言語の文字列はUTF-8エンコーディングであるため、Goの文字列をWindows APIに渡す際には、UTF-16に変換し、さらにヌル終端されたポインタとして渡す必要があります。syscall.StringToUTF16Ptr関数は、この変換処理を行うためのGoのヘルパー関数です。

技術的詳細

このコミットの技術的な核心は、GoのsyscallパッケージがWindows APIをラップする際に使用する型と関数の命名規則と、それらのテストコードにおける正確な参照にあります。

元のコードでは、syscall.Win32finddata1という型とsyscall.FindFirstFile1という関数が使用されていました。これらの命名は、Goのsyscallパッケージの初期開発段階や、特定のAPIのラッパーを試行錯誤していた時期に一時的に存在した可能性のある、あるいは単なるタイポであった可能性のある、非標準的なものです。

Goのsyscallパッケージは、Windows APIのWIN32_FIND_DATA構造体に対してはsyscall.Win32finddataというGoの構造体を、そしてFindFirstFile関数に対してはsyscall.FindFirstFileというGoの関数を正式に提供しています。これらの名前は、Win32 APIの元の名前に忠実であり、Goの命名規則に沿ってキャメルケースに変換されています。

このコミットは、テストコードがこれらの非標準的な名前を参照していたために発生していたビルドエラーを、正式な名前であるsyscall.Win32finddatasyscall.FindFirstFileに修正することで解決しています。これにより、テストコードがGoのsyscallパッケージの安定したAPIと一致するようになり、Windows環境でのコンパイルとテストの実行が正常に行われるようになりました。

特に、TestWin32finddataというテスト関数は、FindFirstFile関数が返すWIN32_FIND_DATA構造体の内容を検証することを目的としています。このテストが正しく機能するためには、FindFirstFileの呼び出しと、その結果を受け取る構造体の型が、syscallパッケージの定義と完全に一致している必要がありました。今回の修正は、この整合性を回復するものです。

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

diff --git a/src/pkg/syscall/syscall_windows_test.go b/src/pkg/syscall/syscall_windows_test.go
index 495eb46a78..79cd8f8691 100644
--- a/src/pkg/syscall/syscall_windows_test.go
+++ b/src/pkg/syscall/syscall_windows_test.go
@@ -27,7 +27,7 @@ func TestWin32finddata(t *testing.T) {
 	f.Close()
 
 	type X struct {
-		fd  syscall.Win32finddata1
+		fd  syscall.Win32finddata
 		got byte
 		pad [10]byte // to protect ourselves
 
@@ -35,7 +35,7 @@ func TestWin32finddata(t *testing.T) {
 	var want byte = 2 // it is unlikely to have this character in the filename
 	x := X{got: want}
 
-	h, err := syscall.FindFirstFile1(syscall.StringToUTF16Ptr(path), &(x.fd))
+	h, err := syscall.FindFirstFile(syscall.StringToUTF16Ptr(path), &(x.fd))
 	if err != nil {
 		t.Fatalf("FindFirstFile failed: %v", err)
 	}

コアとなるコードの解説

このコミットでは、src/pkg/syscall/syscall_windows_test.goファイル内の2箇所が変更されています。

  1. 型名の修正:

    -		fd  syscall.Win32finddata1
    +		fd  syscall.Win32finddata
    

    TestWin32finddata関数内で定義されている匿名構造体Xのフィールドfdの型が、syscall.Win32finddata1からsyscall.Win32finddataに修正されました。 これは、GoのsyscallパッケージがWindows APIのWIN32_FIND_DATA構造体に対応する正式な型としてsyscall.Win32finddataを提供しているためです。以前のWin32finddata1という型は、おそらく開発中の仮の型名か、誤って記述されたものであり、Windowsビルド時のコンパイルエラーの原因となっていました。この修正により、テストコードが正しいデータ構造を使用するようになります。

  2. 関数名の修正:

    -	h, err := syscall.FindFirstFile1(syscall.StringToUTF16Ptr(path), &(x.fd))
    +	h, err := syscall.FindFirstFile(syscall.StringToUTF16Ptr(path), &(x.fd))
    

    syscall.FindFirstFile1関数の呼び出しが、syscall.FindFirstFileに修正されました。 これは、GoのsyscallパッケージがWindows APIのFindFirstFile関数に対応する正式な関数としてsyscall.FindFirstFileを提供しているためです。FindFirstFile1という関数は存在せず、この誤った関数呼び出しがWindowsビルド時のコンパイルエラーを引き起こしていました。この修正により、テストコードがWindowsのファイル検索APIを正しく呼び出すようになります。

これらの変更は、GoのsyscallパッケージのWindows固有のテストコードが、パッケージ内で定義されている正しい型と関数を使用するように修正することで、Windows環境でのビルドエラーを解消し、テストの正確性を保証するものです。

関連リンク

参考にした情報源リンク