构建错误:未知字段'HideWindow'

时间:2018-04-05 14:26:20

标签: go

我正在用golang和Qt制作多平台的Gui应用程序。应用程序执行外部命令。

在Windows中,执行外部命令时会显示DOS窗口。我给出了HideWindow属性,以便不显示它。

  command := exec.Command("hoge", "fuga")
  command.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}

此代码在Windows中运行良好,但在MacOS构建中出现以下错误。

unknown field 'HideWindow' in struct literal of type syscall.SysProcAttr

我修改了如下代码,但我无法避免错误。有什么想法吗?

 if runtime.GOOS == "windows" {
  command.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
 }

1 个答案:

答案 0 :(得分:2)

您无法通过运行时检查修复编译时错误。您需要使用build constraints创建与每个平台兼容的单独实现。要保持DRY,您可能希望创建一个仅处理特定于平台的行为的函数,以便跨平台代码可以调用特定于平台的函数(这可能是一个无操作的函数)不需要平台特定行为的平台)。所以你可能有一个Windows文件,一个用于MacOS,一个用于Linux(或者你支持的任何平台),每个文件都有如下函数:

// +build darwin

package whatever

func prepareBackgroundCommand(cmd *exec.Cmd) {
    cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
}

另一个像:

// +build !darwin

package whatever

func prepareBackgroundCommand(cmd *exec.Cmd) {
}

因此,在您的主(非平台特定)代码中,您可以调用prepareBackgroundCommand(command),它将根据正在编译的平台正确处理它。