51

Go 1 の条件付きコンパイルで問題が発生しました。

これが私のテストコードです。「// +build」制約と「-tags」フラグについて誤解していることはありますか?

main1.go

// +build main1
package main

import (
    "fmt"
)

func main() {
    fmt.Println("This is main 1")
}

main2.go

// +build main2
package main

import (
    "fmt"
)

func main() {
    fmt.Println("This is main 2")
}

「go build」を実行すると、コンパイルエラーが発生します

$ go build -tags 'main1'
# test
./main2.go:8: main redeclared in this block
        previous declaration at ./main1.go:8
4

5 に答える 5

76

// +build XXX空白行を続ける必要があります。

私の簡単な検索では、これが文書化されている場所/かどうかを見つけることができませんでした。しかし、ソースは明らかにそれを呼び出します

于 2012-05-18T09:00:43.370 に答える
12

パッケージビルド

制約を構築する

+buildビルド制約は、ファイルをパッケージに含める条件をリストするディレクティブで始まる行コメント です。制約は (Go だけでなく) どの種類のソース ファイルにも記述できますが、ファイルの先頭近くに記述し、空白行とその他の行コメントのみを前に付ける必要があります。

ビルドの制約をパッケージ ドキュメントと区別するには、一連のビルドの制約の後に空白行を続ける必要があります。

ビルド制約の後に空白行を追加します。例えば、

// +build main1

package main

import (
    "fmt"
)

func main() {
    fmt.Println("This is main 1")
}
于 2013-06-16T15:59:10.200 に答える
12

パッケージを宣言する行の// +build XXX前にpackage mainあるすべてのコメント行は、パッケージの説明と見なされ、 によって解析されるためgodocです。

于 2012-12-02T21:18:04.637 に答える
11

Go 1.17 以降、条件付きビルド タグは//go:build、古い行の代わりにブール式をサポートする行を使用でき// +buildます。

主な改善点

  • //go:build//go:embedコメント形式は、//go:generate//go:noinline、 などの他の go ディレクティブと一致しています。
  • &&ビルド タグ間のブール式の構文は、 and||演算子を使用して標準化されました。

構文比較

表現 // +build //go:build
また // +build foo bar(スペース区切り) //go:build foo || bar
// +build foo,bar //go:build foo && bar
ない (変わらない) // +build !foo //go:build !foo

複数行コメント

より複雑なブール式では括弧を使用できますが、以前は複数行のコメントが必要でした:

から:

// +build foo bar
// +build 386

に:

//go:build (foo || bar) && 386

さらに、//go:build複数の行にわたる複数のディレクティブは許可されなくなりました。

自動フォーマット

さらにgo fmt、ディレクティブを使用してソース ファイルを実行すると// +build、一致するものが自動的に追加されます//go:build

ファイルに // +build 行しか含まれていない場合、gofmt はそれらの上に同等の //go:build 行を追加します。


出典: Go 1.17 build Constraints draft design . (Go 1.17 が正式にリリースされても、現在はまだドラフトです)

于 2021-06-11T12:42:16.080 に答える
4

Build Constraintsドキュメントから:

ビルドの制約をパッケージ ドキュメントと区別するには、一連のビルドの制約の後に空白行を続ける必要があります。

于 2013-05-23T05:26:28.330 に答える