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 ...
随机推荐
- Qt/C++地图导航app/支持qml/手机运行/输入起点终点规划路径/模拟轨迹移动
一.前言说明 搞Qt地图开发这块,随着研究的深入,用户的需求变化,最近又需要在手机上运行,由于本地图组件依赖浏览器控件,而手机安卓上的Qt并没有带qwebengine控件,怎么办呢,不断的努力验证下, ...
- Qt编写地图综合应用36-覆盖物折线
一.前言 折线图目前应用最广的也是用来绘制各种轨迹,折线图其实就是后面动态轨迹图.飞机航线图的前身,公用的一个方法addPolyline,折线图可以设置颜色.粗细.透明度等属性,如果开启了悬浮绘图工具 ...
- Qt编写安防视频监控系统24-自定义悬浮条
一.前言 自定义悬浮条功能集成在通用视频控件中,就是提供一个顶部的悬浮条,放一排功能按钮,有抓拍.录像.云台控制.关闭等,相当于可以直接单击对应的按钮针对该通道的视频进行操作,悬浮条的含义就是鼠标移入 ...
- macOS安装编译pcl
macOS安装编译pcl git clone git@github.com:PointCloudLibrary/pcl.git cd pcl brew install eigen brew insta ...
- 【C语言学习】——命令行编译运行 C 语言程序的完整流程
今天要学习的内容是 命令行编译运行 C 语言程序,进一步理解C语言编译运行的底层实现和编译原理相关知识,下面是命令行编译运行 C 语言程序的完整流程 一.理论讲解 1. 编译原理概述 1.1 编译过程 ...
- Elasticsearch的分享
一.生活中的数据 搜索引擎是对数据的检索,所以我们先从生活中的数据说起.我们生活中的数据总体分为两种: 结构化数据 非结构化数据 结构化数据: 也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格 ...
- Linux curl brew命令详解
命令:curl 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具 ...
- 腾讯云HAI与DeepSeek携手打造私有化高效代码助手
今天,我们依然以DeepSeek-R1大模型为核心,继续探索其在实际场景中的可用性.今天的重点将放在基于DeepSeek-R1大模型,结合JetBrains IDEA 插件代码助手(CodeGPT)进 ...
- Q:Linux查看进程启动服务的精确时间
输入命令 获取进程号 #1#获取进程号ps -ef|grep java|grep 进程名#2#获取启动时间ps -p 进程号 -o lstart 展示启动时间:星期 月 日 小时:分钟:秒 年 一键 ...
- shell 条件语句基础练习
#输出1到15数字 #!/bin/bash for i in `seq 1 15` do echo -e "\033[32m$i\033[0m" done #计算1到100数字之和 ...