今天無心中看到一套代碼,關於獲取系統實時運行情況的開源庫,裏面沒有任何關於系統選擇,可是一個包下面,以不一樣系統名字結尾,例如*_linux.go,*_darwin.go結尾,並且文件內的方法又是同名,衆所周知,go的同一包下面,若是方法同名是會報錯的,因而乎特別好奇, why?linux
帶着疑惑,我去網上搜了一下,瞭解到了一個新的名詞 : build constraints(構建約束)
,其實這個在c++裏面仍是常常會看到,可是做爲一個go開發者,如今才知道🤦♀ 。️看官方解釋:c++
裏面清除描述了,編譯便籤(build tags 勉強翻譯哈),可讓你在構建的時候自動選擇那些文件編譯,那些文件不編譯,而且不止做用於go文件,若是要用,就必須出如今在文件開頭,並且以後還要有空行。
git
也去網上搜了下這些tags: + (編譯)、 !(忽略)...
github
樣子長下面這樣ui
固然還有其餘的些約束,例如指定go版本等等,使用時再作細細研究吧!翻譯
這個主要解決了代碼解耦問題,例如咱們寫的採集器,會針對不一樣的系統都有要一套採集代碼,返回結果是同樣的。若是採用這中方式,只需針對不一樣的系統要增長文件便可。完美解決了之前都是先判斷系統,而後switch的方式。code