golang項目中使用條件編譯


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遵循以下規則

  1. 不同tag域之間用空格區分,他們是OR關系
  2. 同一tag域之內不同的tag用都好區分,他們是AND關系
  3. 每一個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

 

這兩個文件會被編譯器忽略,因為以下划線開頭的文件都會被忽略

參考資料:

  1. https://dave.cheney.net/2013/10/12/how-to-use-conditional-compilation-with-the-go-build-tool


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM