golang項目中使用條件編譯
C語言中的條件編譯
golang中沒有類似C語言中條件編譯的寫法,比如在C代碼中可以使用如下語法做一些條件編譯,結合宏定義來使用可以實現諸如按需編譯release和debug版本代碼的需求
#ifndef #define ... #end
golang中的條件編譯
golang支持兩種條件編譯的實現方式
- build tags
- 文件后綴
1. 通過Build tags實現
build tags 是通過代碼注釋的形式實現的,要寫在文件的最頂端;
go build指令在編譯項目的時候會檢查每一個文件的build tags,用來決定是編譯還是跳過該文件
build tags遵循以下規則
- 不同tag域之間用空格區分,他們是OR關系
- 同一tag域之內不同的tag用都好區分,他們是AND關系
- 每一個tag都由字母和數字構成,!開頭表示條件“非”
示例:
// +build darwin freebsd netbsd openbsd
約束此文件只能在支持kqueue的BSD系統上編譯
一個文件可能包含多行條件編譯注釋,比如:
// +build linux darwin // +build 386
約束該文件在linux/386 或 darwin/386平台編譯
需要注意的點
tag注釋和包聲明必須用空行隔開,比如下面的寫法是錯誤的,編譯器會把第一行作為包說明來處理,而不是build tags
1 // +build !linux 2 package mypkg // wrong
正確的寫法如下:
1 // +build !linux 2 3 package mypkg // correct
編譯方法:
只需要在go build指令后用-tags指定編譯條件即可
go build -tags linux
2. 通過文件名后綴實現
具有_$GOOS.go
后綴的go文件在編譯的時候會根據當前平台來判斷是否將該文件導入並編譯;同樣適用於處理器架構判斷 _$GOARCH.go
。
兩者可以結合起來使用,形式為: _$GOOS_$GOARCH.go
示例:
mypkg_freebsd_arm.go // 只在 freebsd/arm 編譯 mypkg_plan9.go // 只在 plan9 編譯
文件名必須提供,如果只由后綴的文件名會被編譯器忽略,比如:
_linux.go
_freebsd_386.go
這兩個文件會被編譯器忽略,因為以下划線開頭的文件都會被忽略