golang syscall.SysProcAttr 兼容问题

沙鲁要吃人
  • 800
syscall.SysProcAttr{ Setsid: true }

这种写法在 linux 下可以编译,在 windows 下无法编译。

看了一下,exec_windows.goexec_linux.go 下的 SysProcAtrr 类型定义就不同,这种情况,我怎么能有个兼容性的写法呢?

回复
阅读 2.2k
2 个回答

了解下 GO 的条件编译吧,针对不同的条件编译不同的文件,而最常用的就是选择不同系统编译。

所谓条件编译,简单来说,就是通过一个标注标识什么情况下进行编译,如在 linux 下编译的文件,在文件开头加上 +build linux 即可。

举个最简单的例子吧。

目标是根据不同的系统打印输出对应 Hello xxx,一种方式是通过 runtime.GOOS 获取当前的操作系统,这是常规的思路。当时为了演示条件编译,这里通过条件来控制。

首先是 main 函数,如下:

func main() {
    hello()
}

现在要实现根据不同的系统调用不同 hello() 函数,创建三个文件,分别是 hello_linux.go、hello_windows.go 和 hello_darwin.go,通过指定编译条件标识在什么系统进行编译,如下:

hello_linux.go 如下:

// +build linux  
package main  
  
import (  
   "fmt"  
)  
  
func hello() {  
   fmt.Println("Hello Linux!")  
}

hello_darwin.go 如下:

// +build darwin  
package main  
  
import "fmt"  
  
func hello() {  
   fmt.Println("Hello Darwin!")  
}

hello_windows.go,如下:

// +build windows  
package main  
  
import "fmt"  
  
func hello() {  
   fmt.Println("Hello Windows!")  
}

重点关注下 +build 之后的参数。我们执行如下命令:

go run .

因为我的系统是 macos,故打印结果如下:

Hello Darwin!

到此,是不是对条件编译的用户理解的差不多了,有兴趣去网上找几篇文章看看吧。+build 可以支持多个条件,与、或、非三种逻辑关系都是支持的。

你可以也写不同的后缀的文件调用对应的方法,编译的时候会自动查找不同的文件编译的。

你知道吗?

宣传栏