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

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

// +build windows

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

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

我如何解决这个困境?


慕的地8271018
浏览 206回答 2
2回答

动漫人物

我认为您的解决方案是在您的结构上使用一些方法,该方法可在所有平台上使用。查看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文件中,您将定义该函数不执行任何操作(空体)。

largeQ

在某个地方,您显然有一个调用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在每个平台文件中定义,但在实践中我发现这比它值得的麻烦更多。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go