I'm making multi-platform Gui applications with golang and Qt. The application executes an external command.
In Windows, a DOS window is displayed when executing the external command. I gave the HideWindow attribute so as not to display this.
command := exec.Command("hoge", "fuga")
command.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
this code works well in Windows, but the following error occurred in the build for MacOS.
unknown field 'HideWindow' in struct literal of type syscall.SysProcAttr
I modified the code as below, but I can not avoid the error. Are there any ideas?
if runtime.GOOS == "windows" {
command.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
}
You cannot fix a compile-time error with a run-time check. You'll need to use build constraints to create separate implementations compatible with each platform. To stay DRY, you'll likely want to create a function that only handles the platform-specific behavior(s), so that the cross-platform code can then call into the platform-specific function (which may be a no-op on platforms that need no platform-specific behavior). So you might have a file for Windows, one for MacOS, and one for Linux (or whatever set of platforms you're supporting), each with a function like:
// +build darwin
package whatever
func prepareBackgroundCommand(cmd *exec.Cmd) {
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
}
And another like:
// +build !darwin
package whatever
func prepareBackgroundCommand(cmd *exec.Cmd) {
}
So that in your main (non-platform-specific) code, you can call prepareBackgroundCommand(command)
and it will handle it correctly based on the platform it's being compiled for.