在为Linux设置操作系统时,如何为Windows使用syscall.SysProcAttr struct字段

在为Linux设置操作系统时,如何为Windows使用syscall.SysProcAttr struct字段,linux,windows,go,cmd,Linux,Windows,Go,Cmd,我正在编写Go中的代码,它将安装一个程序。它必须运行Linux和Windows系统。 我正在使用Intellij if isWindows() { cmd := exec.Command("msiexec.exe", "/i", filename, "/quiet", "L*V", installLog) cmd.SysProcAttr = &syscall.SysPr

我正在编写Go中的代码,它将安装一个程序。它必须运行Linux和Windows系统。 我正在使用Intellij

    if isWindows() {
        cmd := exec.Command("msiexec.exe", "/i", filename, "/quiet", "L*V", installLog)
        cmd.SysProcAttr = &syscall.SysProcAttr{
            CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP,
        }
        if err := cmd.Start(); err != nil {
            log.Printf(failedInstallMsg, filename, err)
            return
        }
    } else if isLinux() {
            cmd := exec.Command("sudo", "-n", packageManagerTool, "--disablerepo=*", "install", "-y", filename)
            cmd.SysProcAttr = &syscall.SysProcAttr{
                Setpgid: true,
                Pgid: 0,
            }
            if err := cmd.Start(); err != nil {
                log.Printf(failedInstallMsg, filename, err)
                return
            }
        }
    }
我的问题是,由于在IDE Go Project settings>Build标记中,操作系统设置为Linux,因此syscall.SysProcAttr struct字段仅适用于Linux。 这意味着windows案例中使用初始化结构的行

        cmd.SysProcAttr = &syscall.SysProcAttr{
            CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP,
        }
导致编译错误

unknown field CreationFlags in struct literal
我试着加上

// +build linux windows
在文件的顶部,但它没有帮助


有没有一种简单的方法可以让windows和linux的代码以上述方式共存?

如果您还没有弄明白这一点,可以将它们放在单独的文件中,然后使用构建标记或文件

//main.go
包干管
func main(){
//一些东西
forkProcess()
//其他一些事情
}
//fork\u windows.go
//+构建窗口
包干管
进口(
“日志”
“os/exec”
“系统调用”
)
func forkProcess(PackageManager工具、文件名、安装日志、failedInstallMsg字符串){
cmd:=exec.Command(“msiexec.exe”、“/i”、文件名“/quiet”、“L*V”、installLog)
cmd.SysProcAttr=&syscall.SysProcAttr{
CreationFlags:syscall.CREATE\u NEW\u PROCESS\u GROUP,
}
如果错误:=cmd.Start();错误!=nil{
log.Printf(failedInstallMsg、文件名、错误)
}
}
//fork\u linux.go
//+构建linux
包干管
进口(
“日志”
“os/exec”
“系统调用”
)
func forkProcess(PackageManager工具、文件名、安装日志、failedInstallMsg字符串){
cmd:=exec.Command(“sudo”、“-n”、PackageManager工具、“--disablerepo=*”、“install”、“-y”、文件名)
cmd.SysProcAttr=&syscall.SysProcAttr{
Setpgid:true,
Pgid:0,
}
如果错误:=cmd.Start();错误!=nil{
log.Printf(failedInstallMsg、文件名、错误)
返回
}
}
注意:您可以放弃文件中的
\u windows
\u linux
后缀,也可以放弃构建标记(但不能同时放弃两者)。如果您想在一个文件中针对更多的平台(例如,构建标记为
/+Build linux、freebsd、darwin
fork.go
,以及另一个
fork\u other.go
标记为
/+Build windows


有关构建约束的详细信息,请参见

分别为每个操作系统创建一个文件。@Volker我刚刚尝试过。我有一个结构,它将调用为windows制作的文件中的函数(如果是isWindows()),或者为Linux制作的文件中的函数(如果是isLinux())但问题仍然是,由于我在特定于windows的文件中添加了//+构建窗口,因此调用方看不到该函数。只有不同的初始化代码进入依赖于操作系统的文件。类似于isWindows的内容保留在通用代码中。