我正在用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}
}
答案 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)
,它将根据正在编译的平台正确处理它。