問題
Goで以下のファイル名を使うと多くの場合に問題が生じます。
なぜでしょうか?
hoge_ios.go
解答
ファイル末尾の _ios.go
がbuild constraintだとみなされるため。
Goにはビルド対象の環境毎にソースコードを変えることができるbuild constraintという仕組みがあります。
そのため、Windows環境でのみ利用できる機能とLinux環境でのみ利用できる機能を混在させることもできます。
この指定はファイルの先頭に以下のように書くことができますが、ファイル名で指定することもできます。
// +build windows
ファイル名で指定する場合は、ファイル名の末尾を _windows.go
とすると、上記と同じ効果が得られます。
windowsやlinuxなどは良く知られたものなので、目にする機会も多いかと思います
しかし、このbuild constraintに指定できる対象は意外な程に多いです。
以下のドキュメントにかかれているもの全てが対象になります。
特にiosやjsは文字数が少なく、これらの環境向けのGoバイナリを生成することがほぼないため、問題が発生した場合に発見が遅れがちです。
ディレクトリ内の全てのファイルがbuild constraintによってビルド対象から除外された場合は、以下のエラーが発生しますが、そうでない場合は未定義の関数や構造体に関するエラーとしてコンパイルエラーになることが多いです。
build constraints exclude all Go files in XXXXX