前言

在真实环境中,我们可能需要为不同的编译环境编写不同的 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相关推荐

  1. 代码编译 Compile、Make、Build 的区别

    代码编译 Compile.Make.Build 的区别 https://blog.csdn.net/fanzheng220112583/article/details/7780250 VC++6.0中 ...

  2. npm run dev/build/serve

    npm run dev/build/serve 1.ERR引发的思考 npm run dev npm ERR! missing script: devnpm ERR! A complete log o ...

  3. Android Studio 编译异常Could not execute build using Gradle installation解决办法

    Android Studio 编译异常Could not execute build using Gradle installation解决办法 参考文章: (1)Android Studio 编译异 ...

  4. Maven的pom.xml文件结构之Build配置build

    From: https://blog.csdn.net/taiyangdao/article/details/52374125 在Maven的pom.xml文件中,Build相关配置包含两个部分,一个 ...

  5. 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 ...

  6. webpack自动化构建脚本指令npm run dev/build

    指令 为不同环境配置可执行指令,我们使用npm scripts方式,在package.json文件中配置执行指令: {"scripts": {"start": ...

  7. myeclipse ant 编译java_Java MyEclipse下Ant build.xml简单实例详解

    一.下载配置ant 1.首先下载ant: http://www.apache.org/ 下载最新的版本 2.解压ant 后设置ANT_HOME, PATH中添加ANT_HOME目录下的bin目录(如: ...

  8. Xcode13编译提示构建系统错误Legacy Build System

    现象: The Legacy Build System will be removed in a future release. You can configure the selected buil ...

  9. ant编译Jmeter目录下的build.xml失败问题

    执行ant -buildfile build.xml后控制台日志如下(只有报错的一部分): BUILD FAILED /usr/bin/ant/apache-ant-1.10.5/bin/build. ...

最新文章

  1. UnicodeEncodeError: ‘latin-1‘ codec can‘t encode characters in position: ordinal not in range(256)
  2. OpenStack 虚拟机热迁移流程图
  3. 在caffe上跑自己的数据
  4. 通过MATLAB将数据转化为mif文件,供Quartusii软件的ROM核读取调用
  5. 复现经典:《统计学习方法》​第17章 潜在语义分析
  6. Windows搭建FTP服务
  7. flutter 透明度动画_Flutter中的动画填充+不透明度动画✨
  8. ubuntu安装中文字体,python plt 绘图显示中文
  9. Java 执行SQL脚本文件
  10. MATLAB数字图像处理 实验一:图像处理基本操作(平移、放大、缩小、旋转、插值)
  11. 谷歌浏览器如何安装插件-以octotree为例
  12. hotnets 2019 Using ground relays for low-latency wide-area routing in megaconstellations 阅读报告
  13. 2020阿里巴巴实习笔试题一
  14. jmu-ds-集合的并交差运算
  15. 网工必会stp /rstp /mstp (笔记)
  16. Django模板语言DTL中的变量和标签
  17. 「卷无人道」,手机app定制
  18. 国外邮件服务器,在国外发邮件连不上国内的邮件服务器
  19. Raspberry pi 通过iphone手机访问
  20. 进程管理程序 - Supervisor - 学习/实践

热门文章

  1. 蓝桥杯 真题 2021 4、路径
  2. 苹果 企业开发者账号申请入口
  3. c语言查看文件详细信息
  4. U盘系统盘恢复成普通U盘
  5. 服务器系统盘用多少g合适,windows10系统盘需要多大_win10系统盘需要多少g
  6. 卸载office失败的解决办法
  7. 图片处理软件:分享6款非常实用的图片处理工具
  8. 为什么黑客不黑/攻击赌博网站?如何入门黑客?
  9. python复习(2022年8月)
  10. 科学中的直觉和反直觉