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

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

このコミットは、src/cmd/cgo/doc.go ファイル内のドキュメントのタイポ(誤字)を修正するものです。具体的には、Goの関数がCコードにエクスポートされる際の戻り値の型表記に関する誤りを訂正しています。

コミット

  • Author: Maxim Pimenov mpimenov@google.com
  • Date: Tue Dec 6 08:16:39 2011 -0800
  • Commit Message:
    cgo: fix typo in the documentation
    
    R=golang-dev, gri
    CC=golang-dev
    https://golang.org/cl/5448115
    

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

https://github.com/golang/go/commit/972b98c135e271065b5938464d3b1bfe216d1c84

元コミット内容

cgo: fix typo in the documentation

R=golang-dev, gri
CC=golang-dev
https://golang.org/cl/5448115

変更の背景

この変更は、Go言語のcgoツールに関する公式ドキュメント内の誤植を修正することを目的としています。cgoはGoプログラムからC言語のコードを呼び出す、またはC言語のコードからGoの関数を呼び出すためのメカニズムを提供します。ドキュメントは、この相互運用性を正しく説明する必要があります。

今回の修正は、Goの関数がCコードにエクスポートされる際の戻り値の型表記において、C.char*という誤った記述が*C.charという正しい記述に修正されたものです。これは機能的な変更ではなく、あくまでドキュメントの正確性を向上させるための修正です。

前提知識の解説

cgoとは

cgoは、Go言語のプログラムがC言語のコードと連携するためのツールです。Goのソースファイル内にCのコードを直接記述したり、既存のCライブラリをGoから呼び出したりすることを可能にします。これにより、GoのアプリケーションでC言語で書かれた高性能なライブラリやシステムコールを利用できるようになります。

cgoを使用する際には、Goの型とCの型との間のマッピングを理解することが重要です。特にポインタ型は、GoとCで表記方法やセマンティクスが異なるため、注意が必要です。

GoにおけるポインタとCにおけるポインタ

  • Goにおけるポインタ: Go言語では、ポインタは*Typeという形式で宣言されます。例えば、*intint型へのポインタを意味します。Goのポインタは、Cのようなポインタ演算を直接サポートせず、より安全なメモリ管理を提供します。
  • Cにおけるポインタ: C言語では、ポインタはType *という形式で宣言されることが一般的です(例: int *ptr)。これはint型へのポインタを意味します。Cではポインタ演算が頻繁に行われます。

C.char

cgoを使用する際、C言語のプリミティブ型はC.プレフィックスを付けてGoのコード内で参照できます。例えば、Cのchar型はGoのコード内でC.charとして扱われます。同様に、CのintC.int、CのvoidC.voidとなります。

技術的詳細

このコミットの技術的な詳細は、Go言語におけるcgoのドキュメントの正確性に関わります。

Goの関数がCコードにエクスポートされる場合、Goの関数シグネチャはCの関数シグネチャに変換されます。この変換において、Goのポインタ型はCのポインタ型に対応付けられます。

問題の箇所は、Goの関数がCのchar型へのポインタを返す場合の表記でした。

  • 誤った表記: C.char*
  • 正しい表記: *C.char

Go言語の文法では、ポインタ型は常に*が型の前に来ます。例えば、int型へのポインタは*intと書きます。cgoによってCの型がGoの型システムに取り込まれた場合でも、このGoの文法規則は変わりません。したがって、C.char型へのポインタは*C.charと記述するのがGoの正しい文法です。

C.char*という表記は、C言語のポインタ宣言の慣習に似ていますが、Goの文法としては不正です。このタイポは、cgoのドキュメントを読んだ開発者がGoのポインタの正しい記述方法について誤解する可能性がありました。この修正により、ドキュメントの記述がGoの言語仕様と一致し、より正確な情報が提供されるようになりました。

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

--- a/src/cmd/cgo/doc.go
+++ b/src/cmd/cgo/doc.go
@@ -93,7 +93,7 @@ Go functions can be exported for use by C code in the following way:
 	func MyFunction(arg1, arg2 int, arg3 string) int64 {...}
 
 	//export MyFunction2
-	func MyFunction2(arg1, arg2 int, arg3 string) (int64, C.char*) {...}
+	func MyFunction2(arg1, arg2 int, arg3 string) (int64, *C.char) {...}
 
 They will be available in the C code as:
 

コアとなるコードの解説

変更はsrc/cmd/cgo/doc.goファイルの96行目で行われています。

元の行: func MyFunction2(arg1, arg2 int, arg3 string) (int64, C.char*) {...}

修正後の行: func MyFunction2(arg1, arg2 int, arg3 string) (int64, *C.char) {...}

この変更は、MyFunction2というGoの関数がCコードにエクスポートされる例を示している部分です。この関数はint64とCのchar型へのポインタを戻り値として返すと記述されています。

修正前は、C言語のポインタ宣言の慣習であるC.char*という形式で記述されていましたが、Go言語のポインタの文法規則に従い、*C.charという形式に修正されました。これにより、cgoのドキュメントがGoの言語仕様に完全に準拠するようになりました。これは、Goのコード例がGoの正しい文法で記述されていることを保証するための重要な修正です。

関連リンク

参考にした情報源リンク

  • Go言語公式ドキュメント: cgo (GoとCの相互運用性に関する情報)
  • Go言語のポインタに関する公式ドキュメントまたはチュートリアル
  • C言語のポインタに関する一般的な情報