如何导入特定于平台的结构?

时间:2015-10-24 00:22:05

标签: struct go platform

我在一个以这一行开头的文件中有一个结构:

// +build windows

因此它只能在Windows上构建。但是,初始化所有内容的应用程序部分需要检查它是否在Windows上运行,如果是,则创建结构的实例。我不知道如何在不破坏其他平台的情况下如何做到这一点。

例如,如果文件包含函数newWindowsSpecificThing()并且我在Linux上编译,则该函数将不存在,因为它是在未编译的文件中定义的。 (当然,这会产生错误。)

我如何解决这个难题?

2 个答案:

答案 0 :(得分:4)

我认为你的解决方案是在你的struct上有一些方法,用于所有平台。查看dir_*.go文件如何适用于os包。 func (file *File) readdirnames(n int) (names []string, err error)dir_plan9.godir_unix.godir_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,但在实践中我发现了比它更值得的麻烦。