go源代碼區分不同操作系統研究

困惑

在研究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 來實現多個操作系統執行不同的參數
  • 文件名以"_ "開始,編譯的時候會忽略掉
  • 我們使用此方法可以實現多個操作系統執行不同的函數,而不用在同一個函數中來判斷操作系統,非常方便
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章