困惑
在研究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 来实现多个操作系统执行不同的参数
- 文件名以"_ "开始,编译的时候会忽略掉
- 我们使用此方法可以实现多个操作系统执行不同的函数,而不用在同一个函数中来判断操作系统,非常方便