GOPATH 环境变量, 我这里设置为 "d:\golang\" 目录
代码目录结构
d:\golang\src\tagerTest\main.go
// tagerTest project main.gopackage mainimport ( "fmt" "tagerTest/test")func main() { test.Myprint() fmt.Println("Hello World!")}
d:\golang\src\tagerTest\test\p1.go
// +build !xxpackage testimport ( "fmt")func Myprint() { fmt.Println("myprint in p1")}
d:\golang\src\tagerTest\test\p2.go
// +build xxpackage testimport ( "fmt")func Myprint() { fmt.Println("myprint in p2")}
从上面我们看到 p1.go 和 p2.go 中都存在 Myprint() 这个函数
我们现在来编译看看输出结果!
D:\golang\src\tagerTest>go buildD:\golang\src\tagerTest>.\tagerTest.exemyprint in p1Hello World!
没有编译问题,输出结果调用的是 p1.go 里面的 Myprint() 函数!
那么怎么调用 p1.go 里面的 Myprint() 函数了 ?
D:\golang\src\tagerTest>go build -tags=xxD:\golang\src\tagerTest>.\tagerTest.exemyprint in p2Hello World!
在 编译的时候加上了 -tags=xx,编译后发现调用的就是 p2.go 里面的 Myprint() 函数了
条件编译
我们发现,条件编译的关键在于-tags=xx
,也就是-tags
这个标志,这就是Go语言为我们提供的条件编译的方式之一。
好了,回过头来看我们刚开始时 test\p1.go、 test\p2.go两个Go文件的顶部,都有一行注释:
// +build !xx
// +build xx
// +build !xx
表示,tags不是xx
的时候编译这个Go文件。这两行是Go语言条件编译的关键。+build
可以理解为条件编译tags的声明关键字,后面跟着tags的条件。
// +build xx
表示,tags是xx
的时候编译这个Go文件。
也就是说,这两种条件是互斥的,只有当tags=xx
的时候,才会使用p2.go 里面的 Myprint
,其他情况使用p1.go 里面的 Myprint
。