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

在 Go 中封装平台特定代码的正确方法是什么?

在 Go 中封装平台特定代码的正确方法是什么?

Go
阿晨1998 2021-12-13 18:38:18
我想开发一个小的 Go 应用程序,它向演示文稿的观众显示使用的按键快捷方式。要挂钩键盘事件,我将不得不使用一些特定于平台的代码。封装平台特定代码的 Go 方式是什么?我一直在搜索诸如编译器开关或平台模块之类的关键字,但我无法真正找到相关信息。
查看完整描述

2 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

虽然@icza 的答案绝对是 OP 关于条件编译问题的正确权威答案,但在这种特定情况下,更简单的方法可能是值得的。


Go 是一种旨在在每个平台上编译相同(使用相同编译器)的语言,以鼓励跨平台代码和库重用。Go 不是 C/C++,因此必须花费时间来编写明确的跨平台代码。


当然,平台不可知性仅适用于 Go 的运行时,并且您正在尝试捕获按键,为此没有真正的单一平台不可知的解决方案。


因此,我对这个用例的更简单的建议类似于以下内容:


package main


import (

    "runtime"

    kp "kplib"

)


func main () {

    switch runtime.GOOS {

    case "windows":

        kp.WinKey()

    case "darwin":

        kp.MacKey()

    case "linux":

        kp.UnixKey()

    default:

        kp.TryKey()

    }

}

有了隐含的保证,假设kplib将在任何地方编译(只需确保在给定平台上调用正确的方法!)。


查看完整回答
反对 回复 2021-12-13
?
达令说

TA贡献1821条经验 获得超6个赞

平台特定代码的解决方案是构建约束

注意:在 Go 1.17 之前,语法是以 开头的注释行// +build,但 Go 1.17 引入了//go:buildpragma 现在是首选方式。

构建约束,也称为构建标记,是一行注释,以

//go:build

它列出了文件应包含在包中的条件。约束可以出现在任何类型的源文件中(不仅仅是 Go),但它们必须出现在文件顶部附近,前面只能有空行和其他行注释。这些规则意味着在 Go 文件中,构建约束必须出现在 package 子句之前。

所以基本上每个平台特定的 Go 代码应该放在不同的文件中,你可以用它们的目标来标记每个 Go 文件。

例如,如果文件包含 Linux 特定代码(例如系统调用),请以以下方式启动它:

//go:build linux

如果文件包含特定于 Windows 的系统调用,请使用以下命令启动它:

//go:build windows

有更多“选项”可用,请阅读链接的文档。例如,您可以指定对操作系统、架构、Go 版本、正在使用的编译器的约束。您还可以指定多个约束,这些约束将使用逻辑 OR 或 AND 进行解释,或者您可以使用否定(例如,此代码适用于除 linux 之外的每个目标平台)。

您甚至.go可以使用以下约束标记要忽略的文件:

//go:build ignore

请注意,构建约束是特定于编译器的。如果特定编译器无法识别构建约束,则编译器将忽略该文件。例如,Go AppEngine SDK 带有一个内置的、经过修改的 Go 编译器,它额外识别

//go:build appengine

约束,这意味着源文件仅适用于 Google App Engine 平台。“常规”Go 编译器将忽略该文件,如果有人尝试在没有 Go AppEngine SDK 的情况下构建代码,则您可能不会出现一堆编译器错误。


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

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号