前言

在真实环境中,我们可能需要为不同的编译环境编写不同的 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. git remote add Mycat https://github.com/MyCATApache/Mycat-Server.git
  2. 无监督学习和半监督学习
  3. svn authz 授权文件模版
  4. jsp页面页面post传值_在Js页面通过POST传递参数跳转到新页面详解
  5. python运维开发之第八天(socket)
  6. 定时器驱动数码管c语言程序,用c语言编写,实用定时器实现数码管15倒计时
  7. List对象集合的遍历、对象赋值和向前台传递
  8. Linux应用编程基础01:Linux应用编程绪论
  9. 深入理解JS中和||
  10. 敢从头写一个OFFICE,你这么厉害,怎么不来解几个BUG
  11. 基于jQuery UI CSS Framework开发Widget
  12. 电脑后台,电脑后台程序太多如何清理 - 卡饭网
  13. 回溯法求解n个元素的集合的幂集
  14. Apple Pay的使用
  15. 上海理工大学HVAC综合实验室(图)
  16. 素数表(Eratosthenes)
  17. 我,晋升为阿里P9,越想越后怕...
  18. Bulletproof零知识证明
  19. C语言 函数调用时的数据传递
  20. android studio彻底清除代理

热门文章

  1. Python异常处理try,except,else,finally用法解析。
  2. 挂载(具名挂载、匿名挂载)
  3. Bugku:分析 抓到一只苍蝇
  4. 金杉号:目前的农村养殖什么市场销路好?
  5. 路由器修改html加广告,openwrt利用Privoxy实现js广告植入
  6. 欲见未见:曦光未昕,静池林影,放酒当歌,
  7. h5 先加载小图_H5十大辅助神器 “仙” 界有名
  8. 程序员和他的女朋友一起创建了价值 150,000,000 美元的网站
  9. 10-10 查询选修课程超过2门且成绩都在80分以上的学生
  10. linux里实现sl跑火车