[インデックス 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には、FindFirstFile
やFindNextFile
といった関数を使用してファイルやディレクトリを検索する際に、見つかったファイルやディレクトリの情報を格納するための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.Win32finddata
とsyscall.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箇所が変更されています。
-
型名の修正:
- fd syscall.Win32finddata1 + fd syscall.Win32finddata
TestWin32finddata
関数内で定義されている匿名構造体X
のフィールドfd
の型が、syscall.Win32finddata1
からsyscall.Win32finddata
に修正されました。 これは、Goのsyscall
パッケージがWindows APIのWIN32_FIND_DATA
構造体に対応する正式な型としてsyscall.Win32finddata
を提供しているためです。以前のWin32finddata1
という型は、おそらく開発中の仮の型名か、誤って記述されたものであり、Windowsビルド時のコンパイルエラーの原因となっていました。この修正により、テストコードが正しいデータ構造を使用するようになります。 -
関数名の修正:
- 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環境でのビルドエラーを解消し、テストの正確性を保証するものです。
関連リンク
- Go CL 6303061: https://golang.org/cl/6303061
参考にした情報源リンク
- (Web検索は行いませんでしたが、Go言語の
syscall
パッケージのドキュメントやWindows APIの公式ドキュメントが参考になります。)- Go
syscall
package documentation: https://pkg.go.dev/syscall - Microsoft Docs -
WIN32_FIND_DATA
structure: https://learn.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-win32_find_dataa - Microsoft Docs -
FindFirstFile
function: https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-findfirstfilea - Microsoft Docs -
MultiByteToWideChar
(forStringToUTF16Ptr
context): https://learn.microsoft.com/en-us/windows/win32/api/stringapiset/nf-stringapiset-multibytetowidechar
- Go