困惑
在研究go-daemon這個庫的時候 發現不能在windows上正常運行,提示daemon: Non-POSIX OS is not supported,奇怪用goland跳轉到源碼時,發現返回的字符串就是這個。那麼在Linux上能運行嗎?結果讓我很喫驚,可以正常運行,Why?
研究
進入其目錄看了一下
的確以_unix結尾的文件裏並不會返回錯誤,而是正確執行
嘗試
main包下面嘗試
- 創建_stub.go和_unix.go
- 定義兩個同名,同參,同返回的函數
- main函數所在的文件去調用
代碼截圖
結果
編譯錯誤:fun重定義
# go/myTest/system
./main.go:4:10: undefined: fun
結論1
- go語言文件名以_開始,類似於import 不會導包
再次嘗試
給文件名前面加上fun呢?
結果
編譯錯誤:fun重定義
# go/myTest/system
./fun_unix.go:3:6: fun redeclared in this block
previous declaration at ./fun_stub.go:3:20
結論2
- 顯然go語言不會自動根據_unix來判斷操作系統
關鍵是什麼
+build 參數
源碼展示
看來是在文件第一行的註釋來區分的,類似於shell文件最前面的標識,也是通過特殊的註釋來實現的
第三次嘗試
代碼如下:
結果
編譯通過
Win10 運行:得到結果15
CentOS7 運行:得到結果8
最終結論
- go通過首先的 +build 來實現多個操作系統執行不同的參數
- 文件名以"_ "開始,編譯的時候會忽略掉
- 我們使用此方法可以實現多個操作系統執行不同的函數,而不用在同一個函數中來判斷操作系統,非常方便