当前位置: 首页 > 面试题库 >

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

钱朝明
2023-03-14
问题内容

我想开发一个小型Go应用程序,该应用程序向演示文稿的受众显示使用的按键快捷方式。

为了了解键盘事件,我将必须使用一些平台特定的代码。 封装平台特定代码的Go方法是什么?
我一直在寻找诸如编译器开关或平台模块之类的关键字,但我实际上找不到任何相关信息。


问题答案:

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

构建约束,也称为构建标记,是开始的行注释

// +build

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

因此,基本上每个平台特定的Go代码都应该放入不同的文件中,并且您可以将这些Go文件中的每个标记为目标文件。

例如,如果文件包含Linux特定代码(例如syscalls),请使用以下命令启动它:

// +build linux

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

// +build windows

还有更多“选项”可用,请阅读链接的文档。例如,您可以指定对OS,体系结构,Go版本以及所使用的编译器的约束。您还可以指定将使用逻辑OR或AND进行解释的多个约束,或者可以使用取反(例如,此代码适用于除Linux之外的每个目标平台)。

您甚至.go可以通过以下约束将文件标记为要忽略:

// +build ignore

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

// +build appengine

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



 类似资料:
  • null 并且在doc中发现我需要将user传递给bash来避免这个错误。所以我做了: Sudo docker-compose up-d mysql nginx php-fpm workspace phpmyadmin docker-compose exec--user=laradock工作区bash 作曲家创建-Project Laravel/Laravel博客 使用上面的命令,我得到错误: 有

  • 问题内容: 我们知道以下调用约定:“前六个整数或指针参数在寄存器RDI,RSI,RDX,RCX(Linux内核接口中的R10 [17]:124),R8和R9中传递给c / c ++代码”基于以下文章的Linux平台。 https://zh.wikipedia.org/wiki/X86_calling_conventions#x86-64_calling_conventions 但是,Linux平台

  • 问题内容: 我在一个应用程序中无法代表手机号码。 我想知道是否有一个Integer类,它将允许您存储从0417254482开始的数字。也许使用字符串更合适?目前,当我尝试使用整数形式表示电话号码时,我似乎存储的是随机数而不是我打算存储的数字。 问题答案: 使用。除了其他以外,如果使用整数,则将无法存储前导零。你绝对不应该使用(太小)或(数据丢失的风险太大-参见下文);或可能是适当的(除了前导零问题

  • 问题内容: PEP 263定义了如何声明Python源代码编码。 通常,Python文件的前两行应以: 但是我看过很多以以下内容开头的文件: => 编码而不是编码。 那么,声明文件编码的正确方法是什么? 是了编码允许的,因为所使用的正则表达式是懒惰?还是仅仅是声明文件编码的另一种形式? 我问这个问题是因为PEP不在谈论编码,它只是在谈论编码。 问题答案: 在这里检查文档: “如果Python脚本的

  • 问题内容: 目前,为了表示go程序中的换行符,我使用。例如: …将产生一个换行符。 但是,这似乎并不是跨平台的。在其他语言中,PHP用全局常量()表示这一点。是代表在GO / golang一个跨平台的具体方式换行的路吗? 问题答案: 我对此感到很好奇,因此决定看看究竟是做什么的。http://golang.org/src/pkg/fmt/print.go 如果您滚动到最底部,你会看到一个地方,总是

  • 问题内容: 我正在与我的CompSci教授交谈,他建议将所有String 方法编写为: 而不是: 这两行都可以编译,但是我想知道第一种方法的好处是什么?我一直都是后一种方式。错了吗 什么是普通/常规? 问题答案: 第一种方法确保执行比较时不会收到 NullPointerException 。当您尝试在不存在的对象上调用方法时,抛出(发生)此异常。 以下是一些相关的切线:仔细阅读风险自负 不过要注意