2012-05-18 88 views
40

我在Go 1中遇到了條件編譯的問題。Golang條件編譯

這是我的測試代碼。有什麼我誤解了「// +構建」約束和「-tags」標誌?

main1.go

// +build main1 
package main 

import (
    "fmt" 
) 

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

main2.go運行時, 「去建設」,我還有編譯錯誤

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

回答

59

您必須遵守// +build XXX一個空白

// +build main2 
package main 

import (
    "fmt" 
) 

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

線。

在我的簡短搜索中,我無法找到/如果這是記錄。但the source明確要求它

+3

它記錄在http://golang.org/pkg/go/build/#hdr-Build_Constraints中。具體來說:「爲了將構建約束與包文檔區分開來,一系列構建約束必須由空行來完成。」 – chowey

12

正確的,你必須留下一個空行,不// +build XXX後究竟但package main之前,因爲所有前行註釋行聲明包被認爲是包的描述,並通過godoc解析。

9

Package build

建立約束

甲構建約束是一條以 +build指令開始的行註釋,它列出了文件應該包含在軟件包中的爲 。約束可能出現在任何類型的源文件(不只是Go)中,但它們必須出現在文件頂部附近, 之前只有空白行和其他行註釋。

要區分構建約束和包文檔,構建約束的系列 必須後跟一個空行。

構建約束後添加一個空行。例如,

// +build main1 

package main 

import (
    "fmt" 
) 

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