为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕的地8271018 2021-11-15 20:58:35
我在以这一行开头的文件中有一个结构:// +build windows因此,它只能在 Windows 上构建。但是,初始化所有内容的应用程序部分需要检查它是否在 Windows 上运行,如果是,则创建该结构的实例。我不知道如何在不破坏其他平台上的东西的情况下做到这一点。例如,如果文件包含一个函数newWindowsSpecificThing()并且我在 Linux 上编译,则该函数将不存在,因为它是在未编译的文件中定义的。(当然,这会产生错误。)我如何解决这个困境?
查看完整描述

2 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

我认为您的解决方案是在您的结构上使用一些方法,该方法可在所有平台上使用。查看dir_*.go文件如何为os包工作。该func (file *File) readdirnames(n int) (names []string, err error)由提供它是适用于所有平台dir_plan9.godir_unix.godir_windows.go

对于您的问题,我会采用相同的方法,但使用一些可以进行内部工作的通用方法。在您的应用程序逻辑中,您将调用该函数,而在您的file_unix.go文件中,您将定义该函数不执行任何操作(空体)。


查看完整回答
反对 回复 2021-11-15
?
largeQ

TA贡献2039条经验 获得超7个赞

在某个地方,您显然有一个调用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在每个平台文件中定义,但在实践中我发现这比它值得的麻烦更多。


查看完整回答
反对 回复 2021-11-15
  • 2 回答
  • 0 关注
  • 205 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信