golang條件編譯

2021-09-12 23:10:22 字數 2588 閱讀 9829

golang中沒有類似c語言中條件編譯的寫法,比如在c**中可以使用如下語法做一些條件編譯,結合巨集定義來使用可以實現諸如按需編譯release和debug版本**的需求

#ifndef

#define

...#end

但是golang支援兩種條件編譯方式

在源**裡新增標註,通常稱之為編譯標籤( build tag),編譯標籤是在盡量靠近源**檔案頂部的地方用注釋的方式新增

go build在構建乙個包的時候會讀取這個包裡的每個原始檔並且分析編譯便簽,這些標籤決定了這個原始檔是否參與本次編譯

編譯標籤新增的規則(附上原文):

a build tag is evaluated as the or of space-separated options

each option evaluates as the and of its comma-separated terms

each term is an alphanumeric word or, preceded by !, its negation

1). 編譯標籤由空格分隔的編譯選項(options)以"或"的邏輯關係組成

2). 每個編譯選項由逗號分隔的條件項以邏輯"與"的關係組成

3). 每個條件項的名字用字母+數字表示,在前面加!表示否定的意思

例子(編譯標籤要放在原始檔頂部)

// +build darwin freebsd netbsd openbsd
這個將會讓這個原始檔只能在支援kqueue的bsd系統裡編譯

乙個原始檔裡可以有多個編譯標籤,多個編譯標籤之間是邏輯"與"的關係

// +build linux darwin

// +build 386

這個將限制此原始檔只能在 linux/386或者darwin/386平台下編譯.

除了新增系統相關的tag,還可以自由新增自定義tag達到其它目的。

編譯方法:

只需要在go build指令後用-tags指定編譯條件即可

go build -tags mytag1 mytag2
注意:剛開始使用編譯標籤經常會犯下面這個錯誤

// +build !linux

package mypkg // wrong

這個例子裡的編譯標籤和包的宣告之間沒有用空行隔開,這樣編譯標籤會被當做包宣告的注釋而不是編譯標籤從而被忽略掉

下面這個是正確的標籤的書寫方式,標籤的結尾新增乙個空行這樣標籤就不會當做其他宣告的注釋

// +build !linux

package mypkg // correct

用go vet命令也可以檢測到這個缺少空行的錯誤,初期可以用這個命令來避免缺少空行的錯誤

% go vet mypkg

exit status 1

% head headspin.go

// use of this source code is governed by a bsd-style

// license that can be found in the license file.

// +build someos someotheros thirdos,!amd64

// package headspin implements calculates numbers so large

// they will make your head spin.

package headspin

這個方法通過改變檔名的字尾來提供條件編譯,這種方案比編譯標籤要簡單,go/build可以在不讀取原始檔的情況下就可以決定哪些檔案不需要參與編譯。檔案命名約定可以在go/build 包裡找到詳細的說明,簡單來說如果你的原始檔包含字尾:_goos.go,那麼這個原始檔只會在這個平台下編譯,_goarch.go也是如此。這兩個字尾可以結合在一起使用,但是要注意順序:_goos_goarch.go, 不能反過來用:_goarch_goos.go.

例子如下:

mypkg_freebsd_arm.go // only builds on freebsd/arm systems

mypkg_plan9.go // only builds on plan9

編譯標籤和檔案字尾的功能上有重疊,例如乙個檔名:mypkg_linux.go包含了// +build linux將會出現冗餘

通常情況下,如果原始檔與平台或者cpu架構完全匹配,那麼用檔案字尾,例如:

mypkg_linux.go         // only builds on linux systems

mypkg_windows_amd64.go // only builds on windows 64bit platforms

相反,如果滿足以下任何條件,那麼使用編譯標籤:

Golang 編譯 條件編譯

條件編譯 標籤編譯 build tag build build linux and 386 or darwin and not cgo 以 開始,例如 build 支援 goos 與 goarch 並可以具有多個值,用 分割,例如 build linux,darwin,freebsd 支援 不等條件...

golang專案中使用條件編譯

golang中沒有類似c語言中條件編譯的寫法,比如在c 中可以使用如下語法做一些條件編譯,結合巨集定義來使用可以實現諸如按需編譯release和debug版本 的需求 ifndef define end golang支援兩種條件編譯的實現方式 build tags 是通過 注釋的形式實現的,要寫在檔...

Golang 條件語句

在go語言中,條件語句主要包括有if switch與select。注意 go語言中沒有三目運算子,不支援?形式的條件判斷。最簡單的if語句的基本語法 if 條件判斷條件判斷如果為真 true 那麼就執行大括號中的語句 如果為假 false 就不執行大括號中的語句,繼續執行if結構後面的 值得注意的是...