はじめに
build constraintsのための記法は、ver1.17以上で新しい書き方になっていたことを最近知りました。
古い記法
// +build ignore
現在の記法
//go:build ignore
そこでふと「Goは後方互換が保たれた言語だけど、ビルドタグも同様に後方互換されるんだろうか?」という疑問が浮かびました。
今回は、build constraintsの後方互換(?)について調べてみた内容を書いてみます。
調べた結果
go fmt
コマンドを使えば、ver1.16以下で使用されていた古い表現を検知して、自動的に現行の表現を追加してくれるみたいです。
Go versions 1.16 and earlier used a different syntax for build constraints, with a "// +build" prefix. The gofmt command will add an equivalent //go:build constraint when encountering the older syntax.
実際に動作を確認してみた
私の環境は以下になります。
$ go version
go version go1.18 darwin/arm64
今回は以下のソースコードを実行してみたいと思います。
package main
import (
"fmt"
"github.com/be3751/old_bc/sub"
)
func main() {
fmt.Println("Hello, World!")
sub.Sub()
}
// +build ignore
package sub
import "fmt"
func Sub() {
fmt.Println("sub")
}
実行結果は以下の通りでした。
go run, go build で共通して、sub.goがビルド対象から除外されていることが分かります。
また、現行の記法を用いてbuild constraintsを設定した場合においても、同様の出力となります。
$ go run main.go
package command-line-arguments
imports github.com/be3751/old_bc/sub: build constraints exclude all Go files in /Users/be3751/Desktop/old_bc/sub
$ go build main.go
package command-line-arguments
imports github.com/be3751/old_bc/sub: build constraints exclude all Go files in /Users/be3751/Desktop/old_bc/sub
余談ですが、GoogleのGoチームが提供しているVSCode 拡張機能を入れていると、go fmtが自動的に作用するので、古い記法を使用しても保存時に自動で現行の記法を追記してくれます。
結論
- 古い記法で書いたbuild constraintsも機能する
- go fmtは現行の記法を追記してくれるだけ
参考
Build constraintsという節に引用した文の記載があります。