Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.5k views
in Technique[技术] by (71.8m points)

golang syscall.SysProcAttr 兼容问题

syscall.SysProcAttr{ Setsid: true }

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

了解下 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 可以支持多个条件,与、或、非三种逻辑关系都是支持的。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...