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 来实现多个操作系统执行不同的参数
  • 文件名以"_ "开始,编译的时候会忽略掉
  • 我们使用此方法可以实现多个操作系统执行不同的函数,而不用在同一个函数中来判断操作系统,非常方便
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章