我在一个以这一行开头的文件中有一个结构:
// +build windows
因此它只能在Windows上构建。但是,初始化所有内容的应用程序部分需要检查它是否在Windows上运行,如果是,则创建结构的实例。我不知道如何在不破坏其他平台的情况下如何做到这一点。
例如,如果文件包含函数newWindowsSpecificThing()
并且我在Linux上编译,则该函数将不存在,因为它是在未编译的文件中定义的。 (当然,这会产生错误。)
我如何解决这个难题?
答案 0 :(得分:4)
我认为你的解决方案是在你的struct上有一些方法,用于所有平台。查看dir_*.go文件如何适用于os
包。 func (file *File) readdirnames(n int) (names []string, err error)
在dir_plan9.go
,dir_unix.go
和dir_windows.go
中提供,可在所有平台上使用。
对于您的问题,我采用相同的方法,但使用一些内部工作的通用方法。在您的应用程序逻辑中,您将调用该函数,并在file_unix.go
文件中定义该函数不执行任何操作(空体)。
答案 1 :(得分:3)
在某处您显然有一个调用newWindowsSpecificThing()
的函数。这应该是特定于Windows的文件。如果是,那么它是不可用的并不重要。事实上,你有一些东西"检查它是否在Windows上运行"在某处建议if runtime.GOOS == "windows"
语句。而不是那样,将整个if
移动到Windows特定文件中定义的函数中。您还需要在!windows
文件中定义该功能,这很好。
作为我代码中的一个例子,我有一个函数:
func Setup() *config {
var cfg *config
// setup portable parts of cfg
return PlatformSpecificSetup(cfg)
}
然后,我有一个标记为// +build windows
的文件,单向定义PlatformSpecificSetup()
,另一个标记为// +build !windows
,另一个定义了runtime.GOOS
。我永远不必检查config
,我永远不必处理未定义的数据类型。 Setup()
结构本身是在这些文件中定义的,因此每个平台可以有不同的字段(只要它们与type config struct {
// independent stuff
plat *platformConfig
}
足够一致)。如果我更小心,我可以创建一个结构,如:
platformConfig
然后只需在每个平台文件中定义apt-get build-dep vlc
,但在实践中我发现了比它更值得的麻烦。