github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/cmd/cgo/doc.go (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  /*
     6  Cgoを使用すると、Cコードを呼び出すGoパッケージを作成できます。
     7  
     8  # goコマンドでcgoを使用する
     9  
    10  cgoを使用するには、擬似パッケージ「C」をインポートする通常のGoコードを書きます。
    11  その後、GoコードはC.size_tのような型、C.stdoutのような変数、またはC.putcharのような関数を参照できます。
    12  
    13  「C」のインポートが直前にコメントで指定されている場合、そのコメントは前文と呼ばれ、
    14  パッケージのC部分をコンパイルするときにヘッダーとして使用されます。 例えば:
    15  
    16  	// #include <stdio.h>
    17  	// #include <errno.h>
    18  	import "C"
    19  
    20  プリアンブルには、関数や変数の宣言や定義を含むCコードを含めることができます。
    21  これらは、パッケージ「C」に定義されているかのように、Goコードから参照できます。
    22  プリアンブルで宣言されたすべての名前は使用できますが、小文字で始まる場合でも使用できます。
    23  例外:プリアンブルの静的変数は、Goコードから参照できません。静的関数は許可されています。
    24  
    25  $GOROOT/cmd/cgo/internal/teststdioと$GOROOT/misc/cgo/gmpを参照して、例を確認してください。
    26  cgoの使用についての紹介については、「C?Go?Cgo!」を参照してください:
    27  https://golang.org/doc/articles/c_go_cgo.html 。
    28  
    29  CFLAGS、CPPFLAGS、CXXFLAGS、FFLAGS、およびLDFLAGSは、これらのコメント内の疑似#cgoディレクティブで定義できます。
    30  これにより、C、C ++、またはFortranコンパイラの動作を調整できます。
    31  複数のディレクティブで定義された値は連結されます。
    32  ディレクティブには、その効果を制限するビルド制約のリストを含めることができます。
    33  (制約構文の詳細については、https://golang.org/pkg/go/build/#hdr-Build_Constraints を参照してください。)
    34  例えば:
    35  
    36  	// #cgo CFLAGS: -DPNG_DEBUG=1
    37  	// #cgo amd64 386 CFLAGS: -DX86=1
    38  	// #cgo LDFLAGS: -lpng
    39  	// #include <png.h>
    40  	import "C"
    41  
    42  代わりに、'#cgo pkg-config:'ディレクティブに続いてパッケージ名を指定することで、
    43  pkg-configツールを使用してCPPFLAGSとLDFLAGSを取得できます。
    44  例えば:
    45  
    46  	// #cgo pkg-config: png cairo
    47  	// #include <png.h>
    48  	import "C"
    49  
    50  デフォルトのpkg-configツールは、PKG_CONFIG環境変数を設定することで変更できます。
    51  
    52  セキュリティ上の理由から、許可されるフラグは-D、-U、-I、および-lのみです。
    53  追加のフラグを許可するには、CGO_CFLAGS_ALLOWを正規表現に設定し、新しいフラグに一致するようにします。
    54  許可されるフラグを禁止するには、CGO_CFLAGS_DISALLOWを正規表現に設定し、禁止する必要がある引数に一致するようにします。
    55  両方の場合、正規表現は完全な引数に一致する必要があります。-mfoo=barを許可するには、CGO_CFLAGS_ALLOW='-mfoo.*'を使用します。
    56  単にCGO_CFLAGS_ALLOW='-mfoo'ではなく、同様の名前の変数が許可されるCPPFLAGS、CXXFLAGS、FFLAGS、およびLDFLAGSを制御します。
    57  
    58  また、セキュリティ上の理由から、英数字文字といくつかの記号(例えば、'.'など)のみが許可されており、
    59  予期しない方法で解釈されないいくつかの記号が許可されています。
    60  禁止された文字を使用すると、「malformed #cgo argument」エラーが発生します。
    61  
    62  ビルド時に、CGO_CFLAGS、CGO_CPPFLAGS、CGO_CXXFLAGS、CGO_FFLAGS、およびCGO_LDFLAGS環境変数は、
    63  これらのディレクティブから派生したフラグに追加されます。
    64  パッケージ固有のフラグは、環境変数ではなくディレクティブを使用して設定する必要があります。
    65  これにより、変更されていない環境でビルドが機能するようになります。
    66  環境変数から取得したフラグは、上記で説明したセキュリティ上の制限の対象外です。
    67  
    68  パッケージ内のすべてのcgo CPPFLAGSおよびCFLAGSディレクティブは連結され、
    69  そのパッケージのCファイルをコンパイルするために使用されます。
    70  パッケージ内のすべてのCPPFLAGSおよびCXXFLAGSディレクティブは連結され、
    71  そのパッケージのC++ファイルをコンパイルするために使用されます。
    72  パッケージ内のすべてのCPPFLAGSおよびFFLAGSディレクティブは連結され、
    73  そのパッケージのFortranファイルをコンパイルするために使用されます。
    74  プログラム内の任意のパッケージのすべてのLDFLAGSディレクティブは連結され、リンク時に使用されます。
    75  すべてのpkg-configディレクティブは連結され、同時にpkg-configに送信され、
    76  各適切なコマンドラインフラグのセットに追加されます。
    77  
    78  cgoディレクティブが解析されると、文字列${SRCDIR}の出現箇所は、ソースファイルを含むディレクトリの絶対パスに置き換えられます。
    79  これにより、事前にコンパイルされた静的ライブラリをパッケージディレクトリに含め、適切にリンクすることができます。
    80  例えば、パッケージfooがディレクトリ/go/src/fooにある場合:
    81  
    82  	// #cgo LDFLAGS: -L${SRCDIR}/libs -lfoo
    83  
    84  次のように展開されます:
    85  
    86  	// #cgo LDFLAGS: -L/go/src/foo/libs -lfoo
    87  
    88  Goツールが1つ以上のGoファイルで特別なインポート「C」を使用することを検出すると、
    89  ディレクトリ内の他の非Goファイルを検索して、Goパッケージの一部としてコンパイルします。
    90  .c、.s、.S、または.sxファイルはCコンパイラでコンパイルされます。
    91  .cc、.cpp、または.cxxファイルはC ++コンパイラでコンパイルされます。
    92  .f、.F、.for、または.f90ファイルはFortranコンパイラでコンパイルされます。
    93  .h、.hh、.hpp、または.hxxファイルは別途コンパイルされませんが、
    94  これらのヘッダーファイルが変更された場合、パッケージ(およびその非Goソースファイル)が再コンパイルされます。
    95  他のディレクトリのファイルを変更しても、パッケージが再コンパイルされるわけではないため、
    96  パッケージのすべての非Goソースコードはサブディレクトリではなく、パッケージディレクトリに保存する必要があります。
    97  デフォルトのCおよびC++コンパイラは、それぞれCCおよびCXX環境変数によって変更できます。
    98  これらの環境変数には、コマンドラインオプションを含めることができます。
    99  
   100  cgoツールは常に、ソースファイルのディレクトリを含むパスでCコンパイラを呼び出します。
   101  つまり、-I${SRCDIR}が常に暗示されます。これは、ヘッダーファイルfoo/bar.hが、
   102  ソースディレクトリとシステムインクルードディレクトリ(または-Iフラグで指定された他の場所)の両方に存在する場合、
   103  「#include <foo/bar.h>」が常に他のバージョンよりも優先してローカルバージョンを見つけることを意味します。
   104  
   105  cgoツールは、動作が期待されるシステムでのネイティブビルドではデフォルトで有効になっています。
   106  クロスコンパイル時や、CC環境変数が設定されていない場合、およびデフォルトのCコンパイラ(通常はgccまたはclang)がシステムPATHに見つからない場合は、デフォルトで無効になります。
   107  goツールを実行する際にCGO_ENABLED環境変数を設定することで、デフォルトを上書きできます。
   108  cgoの使用を有効にするには、1に設定し、無効にするには0に設定します。
   109  goツールは、cgoが有効になっている場合、ビルド制約「cgo」を設定します。
   110  特別なインポート「C」は、「//go:build cgo」と同じように「cgo」ビルド制約を意味するため、
   111  cgoが無効になっている場合、Cをインポートするファイルはgoツールによってビルドされません。
   112  (ビルド制約の詳細については、https://golang.org/pkg/go/build/#hdr-Build_Constraints を参照してください。)
   113  
   114  クロスコンパイル時には、cgoが使用するCクロスコンパイラを指定する必要があります。
   115  これは、make.bashを使用してツールチェーンをビルドする際に、一般的なCC_FOR_TARGETまたは
   116  より具体的なCC_FOR_${GOOS}_${GOARCH}(例:CC_FOR_linux_arm)環境変数を設定することで行うことができます。
   117  または、goツールを実行する際にいつでもCC環境変数を設定することができます。
   118  
   119  C++コードに対しては、CXX_FOR_TARGET、CXX_FOR_${GOOS}_${GOARCH}、およびCXX環境変数が同様の方法で機能します。
   120  
   121  # GoからCへの参照
   122  
   123  Goファイル内で、GoのキーワードであるCの構造体フィールド名には、アンダースコアを前置することでアクセスできます。
   124  たとえば、xが「type」という名前のフィールドを持つC構造体を指す場合、x._typeでフィールドにアクセスできます。
   125  ビットフィールドやアラインメントされていないデータなど、Goで表現できないC構造体フィールドは、
   126  次のフィールドまたは構造体の末尾に到達するまで、適切なパディングに置き換えられてGo構造体から省略されます。
   127  
   128  標準のC数値型は、以下の名前で利用可能です。
   129  C.char、C.schar(signed char)、C.uchar(unsigned char)、
   130  C.short、C.ushort(unsigned short)、C.int、C.uint(unsigned int)、
   131  C.long、C.ulong(unsigned long)、C.longlong(long long)、
   132  C.ulonglong(unsigned long long)、C.float、C.double、
   133  C.complexfloat(complex float)、およびC.complexdouble(complex double)。
   134  C型void *は、Goのunsafe.Pointerで表されます。
   135  C型__int128_tおよび__uint128_tは、[16]byteで表されます。
   136  
   137  Goで通常はポインタ型で表されるいくつかの特別なC型は、代わりにuintptrで表されます。
   138  詳細については、以下の特別なケースのセクションを参照してください。
   139  
   140  構造体、共用体、または列挙型に直接アクセスするには、
   141  C.struct_statのように、struct_、union_、またはenum_を接頭辞として付けます。
   142  
   143  C型Tのサイズは、C.sizeof_struct_statのように、C.sizeof_Tとして利用可能です。
   144  
   145  Goファイルで、特別な名前_GoString_のパラメータ型を持つC関数を宣言することができます。
   146  この関数は、通常のGo文字列値で呼び出すことができます。
   147  文字列の長さと、文字列の内容へのポインタは、C関数を呼び出すことでアクセスできます。
   148  
   149  	size_t _GoStringLen(_GoString_ s);
   150  	const char *_GoStringPtr(_GoString_ s);
   151  
   152  これらの関数は、他のCファイルではなく、プリアンブルでのみ使用できます。
   153  Cコードは、_GoStringPtrによって返されるポインタの内容を変更してはいけません。
   154  文字列の内容には、末尾のNULバイトがない場合があることに注意してください。
   155  
   156  一般的な場合、GoはCの共用体型をサポートしていないため、
   157  Cの共用体型は同じ長さのGoバイト配列として表されます。
   158  
   159  Goの構造体には、Cの型を埋め込むことはできません。
   160  
   161  Goのコードは、非空のC構造体の末尾にあるサイズゼロのフィールドを参照することはできません。
   162  (サイズゼロのフィールドでできる唯一の操作である)そのようなフィールドのアドレスを取得するには、
   163  構造体のアドレスを取得し、構造体のサイズを加算する必要があります。
   164  
   165  Cgoは、Cの型を同等の非公開のGoの型に変換します。
   166  翻訳が非公開であるため、GoパッケージはCの型をエクスポートされたAPIで公開すべきではありません。
   167  1つのGoパッケージで使用されるCの型は、別のGoパッケージで使用される同じCの型とは異なります。
   168  
   169  任意のC関数(void関数でも)は、複数の代入コンテキストで呼び出すことができ、
   170  戻り値(ある場合)とC errno変数をエラーとして取得できます(関数がvoidを返す場合は、結果値をスキップするために_を使用します)。
   171  例えば:
   172  
   173  	n, err = C.sqrt(-1)
   174  	_, err := C.voidFunc()
   175  	var n, err = C.sqrt(1)
   176  
   177  Cの関数ポインタを呼び出すことは現在サポートされていませんが、
   178  Cの関数ポインタを保持するGo変数を宣言し、GoとCの間で相互に渡すことができます。
   179  Cコードは、Goから受け取った関数ポインタを呼び出すことができます。
   180  例えば:
   181  
   182  	package main
   183  
   184  	// typedef int (*intFunc) ();
   185  	//
   186  	// int
   187  	// bridge_int_func(intFunc f)
   188  	// {
   189  	//		return f();
   190  	// }
   191  	//
   192  	// int fortytwo()
   193  	// {
   194  	//	    return 42;
   195  	// }
   196  	import "C"
   197  	import "fmt"
   198  
   199  	func main() {
   200  		f := C.intFunc(C.fortytwo)
   201  		fmt.Println(int(C.bridge_int_func(f)))
   202  		// Output: 42
   203  	}
   204  
   205  C言語では、固定サイズの配列として書かれた関数引数は、実際には配列の最初の要素へのポインタを必要とします。
   206  Cコンパイラはこの呼び出し規約を認識して、呼び出しを適切に調整しますが、Goはできません。
   207  Goでは、最初の要素へのポインタを明示的に渡す必要があります:C.f(&C.x[0])。
   208  
   209  可変長のC関数を呼び出すことはサポートされていません。C関数ラッパーを使用することで、これを回避することができます。
   210  例えば:
   211  
   212  	package main
   213  
   214  	// #include <stdio.h>
   215  	// #include <stdlib.h>
   216  	//
   217  	// static void myprint(char* s) {
   218  	//   printf("%s\n", s);
   219  	// }
   220  	import "C"
   221  	import "unsafe"
   222  
   223  	func main() {
   224  		cs := C.CString("Hello from stdio")
   225  		C.myprint(cs)
   226  		C.free(unsafe.Pointer(cs))
   227  	}
   228  
   229  いくつかの特別な関数は、データのコピーを作成することによって、
   230  GoとCの型の間を変換します。疑似Go定義では次のようになります。
   231  
   232  	// Go文字列からC文字列へ
   233  	// C文字列はmallocを使用してCヒープに割り当てられます。
   234  	// 解放する責任は呼び出し側にあります。たとえば、C.freeを呼び出すことで解放できます
   235  	// (C.freeが必要な場合はstdlib.hを含めることを忘れないでください)。
   236  	func C.CString(string) *C.char
   237  
   238  	// Goの[]byteスライスからCの配列へ
   239  	// Cの配列はmallocを使用してCヒープに割り当てられます。
   240  	// 解放する責任は呼び出し側にあります。たとえば、C.freeを呼び出すことで解放できます
   241  	// (C.freeが必要な場合はstdlib.hを含めることを忘れないでください)。
   242  	func C.CBytes([]byte) unsafe.Pointer
   243  
   244  	// C文字列からGo文字列へ
   245  	func C.GoString(*C.char) string
   246  
   247  	// 明示的な長さを持つCデータからGo文字列へ
   248  	func C.GoStringN(*C.char, C.int) string
   249  
   250  	// 明示的な長さを持つCデータからGoの[]byteスライスへ
   251  	func C.GoBytes(unsafe.Pointer, C.int) []byte
   252  
   253  // 特別な場合として、C.mallocはCライブラリmallocを直接呼び出すのではなく、
   254  // CライブラリmallocをラップするGoヘルパー関数を呼び出しますが、
   255  // nilを返さないことを保証します。Cのmallocがメモリ不足を示す場合、
   256  // ヘルパー関数はプログラムをクラッシュさせます。Go自体がメモリ不足になった場合と同様です。
   257  // C.mallocは失敗しないため、errnoを返す2つの結果形式はありません。
   258  
   259  // CからGoへの参照
   260  //
   261  // Go関数は、Cコードで使用するために次の方法でエクスポートできます。
   262  
   263  	//export MyFunction
   264  	func MyFunction(arg1, arg2 int, arg3 string) int64 {...}
   265  
   266  	//export MyFunction2
   267  	func MyFunction2(arg1, arg2 int, arg3 string) (int64, *C.char) {...}
   268  
   269  Cコードでは、次のように使用できます。
   270  
   271  	extern GoInt64 MyFunction(int arg1, int arg2, GoString arg3);
   272  	extern struct MyFunction2_return MyFunction2(int arg1, int arg2, GoString arg3);
   273  
   274  // _cgo_export.h生成ヘッダーで見つかった、前文からコピーされたプリアンブルの後にある
   275  // 複数の戻り値を持つ関数は、構造体を返す関数にマップされます。
   276  
   277  すべてのGoの型が有用な方法でCの型にマップできるわけではありません。
   278  Goの構造体型はサポートされていません。Cの構造体型を使用してください。
   279  Goの配列型はサポートされていません。Cのポインタ型を使用してください。
   280  
   281  Goのstring型の引数を取る関数は、上記で説明した _GoString_ 型のCタイプで呼び出すことができます。
   282  _GoString_ 型は自動的にプリアンブルで定義されます。
   283  Cコードからこの型の値を作成する方法はありません。これは、GoからCに文字列値を渡し、
   284  再びGoに戻すためにのみ有用です。
   285  
   286  ファイルで//exportを使用すると、プリアンブルに制限が設けられます。
   287  2つの異なるC出力ファイルにコピーされるため、定義ではなく宣言のみを含める必要があります。
   288  ファイルに定義と宣言の両方が含まれている場合、2つの出力ファイルは重複するシンボルを生成し、
   289  リンカーが失敗します。これを回避するには、定義を他のファイルのプリアンブルまたはCソースファイルに配置する必要があります。
   290  
   291  # ポインタの渡し方
   292  
   293  Goはガベージコレクションされる言語であり、ガベージコレクタはGoメモリへのすべてのポインタの場所を知る必要があります。
   294  そのため、GoとCの間でポインタを渡す際には制限があります。
   295  
   296  このセクションでは、Goポインタという用語は、Goによって割り当てられたメモリへのポインタを意味します
   297  (&演算子を使用するか、定義済みのnew関数を呼び出すことによって)。
   298  Cポインタという用語は、Cによって割り当てられたメモリへのポインタを意味します(C.mallocを呼び出すことによって)。
   299  ポインタがGoポインタであるかCポインタであるかは、メモリがどのように割り当てられたかによって動的に決定されます。
   300  ポインタの型とは何の関係もありません。
   301  
   302  いくつかのGoの型の値は、型のゼロ値以外に常にGoポインタを含みます。
   303  これは、string、slice、interface、channel、map、およびfunction型に当てはまります。
   304  ポインタ型はGoポインタまたはCポインタを保持できます。
   305  配列と構造体型は、要素型によってGoポインタを含む場合と含まない場合があります。
   306  以下のすべてのGoポインタに関する議論は、ポインタ型だけでなく、
   307  Goポインタを含む他の型にも適用されます。
   308  
   309  Cに渡されるすべてのGoポインタは、固定されたGoメモリを指す必要があります。
   310  C関数に関数引数として渡されるGoポインタは、
   311  呼び出しの期間中暗黙的に固定されたメモリを指します。
   312  これらの関数引数から到達可能なGoメモリは、Cコードがアクセスできる限り固定されている必要があります。
   313  Goメモリが固定されているかどうかは、そのメモリ領域の動的なプロパティであり、
   314  ポインタの型とは何の関係もありません。
   315  
   316  newを呼び出すことによって、複合リテラルのアドレスを取得することによって、またはローカル変数のアドレスを取得することによって作成されたGo値は、
   317  [runtime.Pinner] を使用してメモリを固定することもできます。この型は、メモリの固定状態の期間を管理するために使用でき、
   318  C関数呼び出しの期間を超えてメモリを固定することができます。メモリは複数回固定でき、
   319  固定された回数と同じ回数だけ固定を解除する必要があります。
   320  
   321  Goのコードは、ポイント先のメモリにGoポインタが含まれていない場合、
   322  GoポインタをCに渡すことができます。構造体のフィールドにポインタを渡す場合、
   323  問題のGoメモリはフィールドによって占有されるメモリであり、構造体全体ではありません。
   324  配列またはスライスの要素にポインタを渡す場合、問題のGoメモリは
   325  配列全体またはスライスのバッキング配列全体です。
   326  
   327  Cのコードは、Goポインタが指すメモリが固定されている限り、Goポインタのコピーを保持できます。
   328  
   329  Cのコードは、呼び出しが返された後、Goポインタのコピーを保持することはできません。
   330  ただし、ポインタが指すメモリが [runtime.Pinner] で固定され、PinnerがGoポインタがCメモリに格納されている間にアンピンされない場合は、
   331  Cのメモリに格納されたGoポインタを保持できます。
   332  これは、Cコードが文字列、スライス、チャネルなどのコピーを保持できないことを意味します。
   333  これらは [runtime.Pinner] で固定できないためです。
   334  
   335  _GoString_ 型も [runtime.Pinner] で固定することはできません。
   336  Goポインタを含むため、指すメモリは呼び出しの期間だけ固定されます。
   337  _GoString_ 値はCコードによって保持されることはできません。
   338  
   339  Cコードによって呼び出されるGo関数は、
   340  ピン留めされたメモリへのGoポインタを返すことができます
   341  (これは、文字列、スライス、チャネルなどを返すことはできないことを意味します)。
   342  Cコードによって呼び出されるGo関数は、Cポインタを引数として取ることができ、
   343  それらのポインタを介して非ポインタデータ、Cポインタ、またはピン留めされたGoポインタを格納することができます。
   344  Goポインタを指すメモリにGoポインタを格納することはできません。
   345  (これは、文字列、スライス、チャネルなどを格納することはできないことを意味します)。
   346  Cコードによって呼び出されるGo関数は、Goポインタを取ることができますが、
   347  指すGoメモリ(およびそのメモリが指すGoメモリなど)がピン留めされていることを保証する必要があります。
   348  
   349  これらのルールは、実行時に動的にチェックされます。チェックは、GODEBUG環境変数のcgocheck設定によって制御されます。
   350  デフォルトの設定はGODEBUG=cgocheck=1で、比較的安価な動的チェックが実装されています。
   351  これらのチェックは、GODEBUG=cgocheck=0を使用して完全に無効にすることができます。
   352  ポインタの処理の完全なチェックは、実行時間のコストがかかりますが、GODEBUG=cgocheck=2を使用して利用できます。
   353  
   354  unsafeパッケージを使用することで、この強制を無効にすることができます。
   355  もちろん、Cコードが好きなことをすることを防ぐものは何もありません。
   356  ただし、これらのルールを破るプログラムは、予期しない方法で失敗する可能性があります。
   357  
   358  runtime/cgo.Handle型は、GoとCの間で安全にGo値を渡すために使用できます。
   359  詳細については、runtime/cgoパッケージのドキュメントを参照してください。
   360  
   361  注:現在の実装にはバグがあります。GoコードはCメモリにnilまたはCポインタ(ただしGoポインタではない)を書き込むことが許可されていますが、
   362  現在の実装では、Cメモリの内容がGoポインタであるように見える場合には、ランタイムエラーが発生することがあります。
   363  したがって、Goコードがその中にポインタ値を格納する場合は、初期化されていないCメモリをGoコードに渡すことを避けてください。
   364  Cでメモリをゼロにしてから渡してください。
   365  
   366  # 特殊なケース
   367  
   368  通常、Goではポインタ型で表されるいくつかの特殊なC型は、代わりにuintptrで表されます。それらには以下が含まれます:
   369  
   370  1. Darwinの*Ref型、CoreFoundationのCFTypeRef型に根ざしています。
   371  
   372  2. JavaのJNIインターフェースからのオブジェクト型:
   373  
   374  	jobject
   375  	jclass
   376  	jthrowable
   377  	jstring
   378  	jarray
   379  	jbooleanArray
   380  	jbyteArray
   381  	jcharArray
   382  	jshortArray
   383  	jintArray
   384  	jlongArray
   385  	jfloatArray
   386  	jdoubleArray
   387  	jobjectArray
   388  	jweak
   389  
   390  3. EGL APIからのEGLDisplayとEGLConfigのタイプ。
   391  
   392  これらのタイプは、Go側ではuintptrであるため、Goガベージコレクターが混乱する可能性があるためです。これらは、時には本当にポインタではなく、ポインタタイプにエンコードされたデータ構造です。これらのタイプのすべての操作はCで実行する必要があります。空のこのような参照を初期化するための適切な定数は0であり、nilではありません。
   393  
   394  これらの特別なケースは、Go 1.10で導入されました。Go 1.9以前からの自動更新コードには、Go fixツールのcftypeまたはjniの書き換えを使用してください。
   395  
   396  	go tool fix -r cftype <pkg>
   397  	go tool fix -r jni <pkg>
   398  
   399  適切な場所でnilを0に置き換えます。
   400  
   401  EGLDisplayの場合は、Go 1.12で導入されました。Go 1.11以前のコードから自動更新するには、eglの書き換えを使用してください。
   402  
   403  	go tool fix -r egl <pkg>
   404  
   405  EGLConfigの場合は、Go 1.15で導入されました。Go 1.14以前のコードから自動更新するには、eglconfの書き換えを使用してください。
   406  
   407  	go tool fix -r eglconf <pkg>
   408  
   409  # cgoを直接使用する
   410  
   411  使用法:
   412  
   413  	go tool cgo [cgoオプション] [-- コンパイラオプション] goファイル...
   414  
   415  Cgoは、指定された入力Goソースファイルを複数の出力GoおよびCソースファイルに変換します。
   416  
   417  パッケージのC部分をコンパイルするためにCコンパイラを呼び出す際に、コンパイラオプションは解釈されずにそのまま渡されます。
   418  
   419  次のオプションは、cgoを直接実行する場合に使用できます。
   420  
   421  	-V
   422  		cgoのバージョンを表示して終了します。
   423  	-debug-define
   424  		デバッグオプション。#defineを出力します。
   425  	-debug-gcc
   426  		デバッグオプション。Cコンパイラの実行と出力をトレースします。
   427  	-dynimport file
   428  		fileがインポートするシンボルのリストを書き込みます。-dynout引数または標準出力に書き込みます。cgoパッケージをビルドするときにgo buildによって使用されます。
   429  	-dynlinker
   430  		-dynimport出力の一部として動的リンカーを書き込みます。
   431  	-dynout file
   432  		-dynimport出力をfileに書き込みます。
   433  	-dynpackage package
   434  		-dynimport出力のためのGoパッケージを設定します。
   435  	-exportheader file
   436  		エクスポートされた関数がある場合、生成されたエクスポート宣言をファイルに書き込みます。
   437  		Cコードはこれを#includeして宣言を見ることができます。
   438  	-importpath string
   439  		Goパッケージのインポートパス。オプションです。生成されたファイルのコメントに使用されます。
   440  	-import_runtime_cgo
   441  		設定されている場合(デフォルトで設定されています)、生成された出力でruntime/cgoをインポートします。
   442  	-import_syscall
   443  		設定されている場合(デフォルトで設定されています)、生成された出力でsyscallをインポートします。
   444  	-gccgo
   445  		gcコンパイラではなく、gccgoコンパイラ向けの出力を生成します。
   446  	-gccgoprefix prefix
   447  		gccgoで使用する-fgo-prefixオプション。
   448  	-gccgopkgpath path
   449  		gccgoで使用する-fgo-pkgpathオプション。
   450  	-gccgo_define_cgoincomplete
   451  		古いgccgoバージョン用に、cgo.Incompleteをインポートする代わりにローカルで定義します。
   452  		"runtime/cgo"パッケージから。
   453  	-godefs
   454  		Cパッケージ名を実際の値に置き換えたGo構文で入力ファイルを書き出します。
   455  		新しいターゲットをブートストラップするときにsyscallパッケージ内のファイルを生成するために使用されます。
   456  	-objdir directory
   457  		すべての生成されたファイルをディレクトリに配置します。
   458  	-srcdir directory
   459  */
   460  package main