在使用go來開發跨平臺應用的時候,比如配置文件的路徑,我們希望設置一個默認值,windows下的路徑是類似??d:\myapp\app.conf 這樣的, unix系統中的路徑是 /opt/myapp/app.conf 這樣的, 而我們在使用的時候需要使用的是同一個變量名來代表他們, 那么就要把 //go:build? 這個請出來了, 他可以根據不同的平臺來編譯對應的go文件。
對于這類的信息我們一般只是模塊內使用,那最好是是使用 internal文件夾來保護一下,如我們假設有如下2個文件來保存我們的默認配置信息:
internal/vars/defaults_notwin.go
internal/vars/defaults_windows.go
這2個文件內容如下:
defaults_notwin.go?
//go:build !windows
// 非windows系統編譯package varsvar (DefaultConfigFile = "/opt/myapp/app.conf")
defaults_windows.go
package varsimport ("os"
)var (DefaultConfigFile = os.Getenv("SYSTEMDRIVE") + `\myapp\app.conf`
)
可見他們的包名一樣,2個文件里面定義的變量名也是一樣的, 而我們的編譯器卻不會報錯,這個是為什么呢??
細心的你應該看出,在第一個文件defaults_notwin.go?的開頭 有1行"注釋"??//go:build !windows
注意,在//后面沒有空格,這個是go里面的特殊用法,而注釋通常在//后面是有一個空格的?
這個地方的?//go:build !windows 表示告訴編譯器 當前文件在非windows系統時編譯,而另外一個文件?defaults_windows.go? 就只會在windows系統時才會編譯, 則就保證了同一個包中使用了2個同名變量而不會報錯。
我們在代碼中要使用這個變量的時候就可以直接使用??confFileDefault := vars.DefaultConfigFile 而不用考慮當前平臺是windows還是unix了。