go 编译约束//go:build dev //+build
前言
在真实环境中,我们可能需要为不同的编译环境编写不同的 Go 代码,所以需要做构建约束。
比如:syscall.NewLazyDLL("test.dll")
加载 dll 的程序在 Linux 平台中就没有,所以当你写程序时就需要指定包含这个 API 的文件只能在 Windows 下面编译,在其他平台自动忽略,这样就不会代码移植到别的平台出现编译时错误了。
Go 语言对这一问题的解决方案是在文件层面进行有条件的编译:每个文件要么在编译中,要么不在。
也就是,假设不符合构建约束的场景。那么会直接不编译这个文件,因为它不在编译范围内。
那程序再想运行时,就会报错,表示找不到文件。
构建约束的背景
最早的构建约束是在 2011 年 9 月引入的,我们平时常见的构建约束(build constraint),也叫做构建标记(build tag),构建约束必须出现在 package 之前。
通过代码文件中添加注释进行约束
平时会在 Go 工程的文件中的最开始会看到如下行注解:
// +build
为了将构建约束与包文档区分开来,构建约束后必须跟一个空行。
// +build linux,386 darwin,!cgo
又或是:
// +build linux darwin
// +build amd64
还可以根据 Go 版本来约束:
// +build go1.9
其主要支持如下几种:
- 指定编译的操作系统,例如:windows、linux 等,对应 runtime.GOOS 的值。
- 指定编译的计算机架构,例如:amd64、386,对应 runtime.GOARCH 的值。
- 指定使用的编译器,例如:gccgo、gc,是否开启CGO,cgo。
- 指定 Go 版本,例如:go1.19、go1.20 等。
- 指定自定义的标签,例如:编译时通过指定 -tags 传入的值。
- // +build ignore,编译时自动忽略该文件
- ……
标签之间有如下几种运算关系:
空格表示:AND
逗号表示:OR
!表示:NOT
换行表示:AND
比如:
// +build linux,386 darwin,!cgo
运算表达式为:(linux && 386) || (darwin && !cgo)
使用文件后缀进行约束
这种方式就是通过文件的后缀名来对要指定平台的编译的文件进行约束,文件格式如下:
sourcefilename_GOOS_GOARCH
上面的格式就是文件名_系统名_架构名.go,GOOS和GOARCH可以通过go env看到,也可以在环境变量中指定;下面举个例子:
user_windows_amd64.go //在 windows 中 amd64 架构下才会编译,其他的环境中会自动忽略
user_linux_arm.go // 在 linux 中的 arm 架构下才会编译,其他环境中会自动忽略
go 编译约束//go:build dev //+build的更多相关文章
- 【转】Ubuntu10.04上编译Android源码(Build Android source in Ubuntu10.04 Platform)
原文网址:http://blog.csdn.net/chenyafei617/article/details/6570928 一.Introduction 今天我们就来谈谈如何在Ubuntu平台上面编 ...
- npm run dev/build/serve
1.ERR引发的思考 npm run dev npm ERR! missing script: dev npm ERR! A complete log of this run can be found ...
- 代码编译 Compile、Make、Build 的区别
代码编译 Compile.Make.Build 的区别 https://blog.csdn.net/fanzheng220112583/article/details/7780250 VC++6.0中 ...
- (转)Maven的pom.xml文件结构之Build配置build
在Maven的pom.xml文件中,Build相关配置包含两个部分,一个是<build>,另一个是<reporting>,这里我们只介绍<build>. 1. 在M ...
- npm WARN build `npm build` called with no arguments. Did you mean to `npm run-script build`?
跑npm build结果如下: npm WARN build `npm build` called with no arguments. Did you mean to `npm run-script ...
- cmake编译成功之后VS2015可以build Solution但是不可以运行的解决办法
1.在VS2015解决方案管理器中删除掉ALL_BUILD和ZERO_CHECK项,只保留Cmake生成的工程文件. 2.进行第一部之后还是有可能生成(build)失败,此时有可能是缺少文件.
- ionic2 在执行ionic serve后报 build dev failed: Cannot set property 'fileSystem' of null
ionic2 真是烦人,因为环境依赖的问题还有网络的问题,不知砸的,项目放一段事件不运行就会出问题. 我一开始是 用 cnpm install安装的依赖,其中也报了错, 然后执行 ionic serv ...
- Angular6之ng build | ng build --aot | ng build --prod 差异
由于写了大半年的项目终于要告一段落并且即将进行第二阶段优化开发,emmm 基础版本已经二十多个模块了,必不可少的优化是很重要的,尽管项目上使用多层嵌套懒加载,但是在首屏加载的时候,任然很慢啊,因为一直 ...
- Project 'king.commons' is missing required library: 'lib/plweb.jar' Build path Build Path Problem
问题描述:之前在项目里引用一个jar 包,后来不用了删掉 ,但是没有删干净,然后报以下错误. 解决方案: 1.删除libraries 2.找到该项目下的 .classpath 文件,用记事本打开 ,删 ...
- npm 常用配置
npm config list/ls 显示配置信息npm config list/ls -l 更详细npm -h 显示帮助信息,建议多查看npm -l display full usage info ...
随机推荐
- WxPython跨平台开发框架之图标选择界面
在使用 wxPython 开发跨平台桌面应用程序时,创建一个图标选择界面通常用于让用户从图标资源库中选择图标,我们可以把图标分为自定义的图标资源和系统的图标资源两大类,最终我们把它们整合一起使用,在框 ...
- 『AotuHotKey』——一个小巧却高效的实用效率工具
[!note] 本来主要是想找一下「」和『』,然后这个方法直接可以找到大部分的特殊字符 通过输入法输出 『Ctr + shift + Z』进入搜狗输入法的『符号大全』 在『标点符号』项可以找到「」和『 ...
- V3Det&Bigdetection下载记录
V3Det dataset https://opendatalab.com/V3Det BigDetection
- 场景题:假设有40亿QQ号,但只有1G内存,如何实现去重?
当数据量比较大时,使用常规的方式来判重就不行了.例如,使用 MySQL 数据库判重,或使用 List.contains() 或 Set.contains() 判重就不行了,因为数据量太大会导致内存放不 ...
- WPF设置默认语言地区CultureInfo
public partial class App : Application { public App() { CultureInfo cultureInfo = new CultureInfo(&q ...
- c# set Webbowser version with WPF/Winform app
<Window x:Class="TestWPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/200 ...
- ffmpeg简易播放器(1)--了解视频格式
视频帧 对于一份视频,实质上是多张图片高速播放形成的.每一张图片即为该视频的一帧.而每秒钟播放的图片张数便为所谓的帧率(Frame Rate/Frame Per Second).常见的帧率有24fps ...
- 密码学报如何正确Latex投稿?
记录一下<密码学报>投稿遇到的坑,要不研究一下,投稿都不会投!(死在第一步) 模版地址 http://www.jcr.cacrnet.org.cn/CN/column/column13.s ...
- cmake-2
似懂非懂,一定要搞懂基础的,剩下的边做边学,从案例中入手. 有关cmake的介绍,请参考: 1.https://www.cnblogs.com/pam-sh/p/13885959.html 2.htt ...
- python ModuleNotFoundError_ No module named 'xxx'的解决方案
本文主要针对的自己写的包无法正常import的情况,如果是第三方包的话正常来说没有问题. 第三方包 主要考虑没有安装对应的版本以及包名写错了等奇葩情况,具体可参考ModuleNotFoundError ...