Go build constraints
Go语言有一个不(奇)错(葩)的设计,就是build constraints(构建约束)。可以在源码中通过注释的方式指定编译选项,比如只允许在linux下,或者在386的平台上编译啊之类的;还可以通过文件名来约束构造,比如xxxx_linux.go,就是只允许在linux下编译,xxx_windows_amd64.go就是只允许在windows x64下编译。
构建约束可以在很多文件中使用,不单单是GO文件。但是必须要注意的是,通过注释实施构建约束的话,比如要放在文件的开头,要优先于空行或和其他注释之前。也就是说必须在package语句的前面写。这就有个很蛋疼的文件,因为GO的godoc是可以提取代码中的注释然后转换为文档的。在package语句之前写的注释会被认为是包级别的注释。而构建约束又在所有注释之前,那么为了区分包级别的注释,就要在构建约束与包级别的注释之间添加空行进行区分。(这个设计看上去不得不承认很囧)。
通过注释实施的构建约束还可以进行逻辑表达。就是and, or之类的语义。GO的官方是这么定义的:如果构建约束中有空格,那么就是OR关系,如果是逗号分隔,那么就是AND关系。!表示not。比如
// +build linux,386 darwin,!cgo
就是表示(linux AND 386) OR (darwin AND (NOT cgo))
而且GO还支持多行的构建约束,多行之间是AND关系,比如
// +build linux darwin
// +build 386
就是表示(linux OR darwin) AND 386
GO官方还定义了常用的一些约束
- 限制目标操作系统,也就是要和runtime.GOOS一致
- 限制目标架构平台,也就是要和runtime.GOARCH一致
- GC或者GCCGO等编译器支持的约束
- cgo约束,也就是说如果支持cgo的话,就可以参与编译
- go1.1,表示从go1.1开始向前兼容
- go1.2,表示从1.2开始向前兼容
- go.13,表示从1.3开始向前兼容
- 自定义的约束
如果你想临时让某个文件不参与编译,可以添加注释约束下: // +build ignore
通过注释来实现构建约束有点蛋疼,而且GO官方定义里还表示可以自定义约束,那么可以用来干嘛?学GO的人都知道GO内建了单元测试的框架,跑跑一般的单元测试还是非常嗨皮的,但是如果要做一些简单的集成测试就令人拙计了,因为go test默认就是跑最基本的单元测试。那么怎么只执行集成测试的代码呢?其实就可以通过构建约束来实施。比如我们在集成测试的GO文件中加上 // +build integration 然后运行命令 go test –tags=”integration”就可以只运行我们的集成测试代码了。
虽然通过注释的方式对构建进行了约束,但是文件名的构建约束反而让人觉着很不错呢,至少在工程里看着一目了然。文件名前缀只要含有_GOOS, _GOARCH, _GOOS_GOARCH的就可以了。比如xxx_linux.go yyy_windows_amd64.go , zzzz_386.s等等。
Go build constraints的更多相关文章
- 说说Golang的使用心得
13年上半年接触了Golang,对Golang十分喜爱.现在是2015年,离春节还有几天,从开始学习到现在的一年半时间里,前前后后也用Golang写了些代码,其中包括业余时间的,也有产品项目中的.一直 ...
- Go命令官方指南【原译】
启动错误报告 编译包和依赖项 删除目标文件和缓存的文件 显示包或符号的文档 打印Go环境信息 更新包以使用新API Gofmt(重新格式化)包源 通过处理源生成Go文件 下载并安装包和依赖项 编译并安 ...
- Golang之go 命令用法
Go 命令 Go 命令 Go语言自带有一套完整的命令操作工具,你可以通过在命令行中执行go来查看它们: 图1.3 Go命令显示详细的信息 这些命令对于我们平时编写的代码非常有用,接下来就让我们了解一些 ...
- 浏览器与go语言的websocket通信
简介WebSocket是HTML5一种新的协议.顾名思义,它在服务器和浏览器之间建立了全双工通信. 需求背景区块链测试系统web前端平台需要动态接收后端发送的状态信息改变一次测试session过程的状 ...
- 04 Go 1.4 Release Notes
Go 1.4 Release Notes Introduction to Go 1.4 Changes to the language For-range loops Method calls on ...
- 01 Go 1.1 Release Notes
Go 1.1 Release Notes Introduction to Go 1.1 Changes to the language Integer division by zero Surroga ...
- Go按照条件编译
Go 支持按照条件编译,具体来说它是通过 go/build包 里定义的tags和命名约定来让Go的包可以管理不同平台的代码 . 我们这里以下面这个开源项目为例,来看Go的按条件编译, 这个开源项目是把 ...
- go学习笔记-常见命令
常见命令 go 命令 可以在控制台执行go来查看 go Go is a tool for managing Go source code. Usage: go <command> [arg ...
- Golang的标准命令简述
Golang的标准命令简述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Go本身包含了大量用于处理Go程序的命令和工具.go命令就是其中最常见的一个,它有许多子命令,接下来就跟随 ...
随机推荐
- ASP.NET Core 之 Identity 入门(三)
前言 在上一篇文章中,我们学习了 CookieAuthentication 中间件,本篇的话主要看一下 Identity 本身. 最早2005年 ASP.NET 2.0 的时候开始, Web 应用程序 ...
- ABP框架 - OData 集成
文档目录 本节内容: 简介 安装 安装Nuget包 设置模块依赖 配置你的实体 创建控制器 示例 获取实体列表 请求 响应 获取单个实体 请求 响应 获取单个实体及导航属性 请求 响应 查询 请求 响 ...
- Hawk 6. 编译和扩展开发
Hawk是开源项目,因此任何人都可以为其贡献代码.作者也非常欢迎使用者能够扩展出更有用的插件. 编译 编译需要Visual Stuido,版本建议使用2015, 2010及以上没有经过测试,但应该可以 ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- SDWebImage源码解读 之 SDWebImageCompat
第三篇 前言 本篇主要解读SDWebImage的配置文件.正如compat的定义,该配置文件主要是兼容Apple的其他设备.也许我们真实的开发平台只有一个,但考虑各个平台的兼容性,对于框架有着很重要的 ...
- 手机web如何实现多平台分享
话说App一般都带有分享到社交平台的入口,web网页的分享也有很不错的框架,但是随着HTML5的不断发展,手机web页面越来越多的进入到我们的生活中,那如何在我们的手机上完成分享呢?话说各大分享平台都 ...
- RunLoop 总结:RunLoop的应用场景(一)
参考资料 好的书籍都是值得反复看的,那好的文章,好的资料也值得我们反复看.我们在不同的阶段来相同的文章或资料或书籍都能有不同的收获,那它就是好文章,好书籍,好资料.关于iOS 中的RunLoop资料非 ...
- jquery.multiselect 多选下拉框实现
第一步:链接下列文件,如果没有,到此网页下载 https://github.com/ehynds/jquery-ui-multiselect-widget,此插件基于jquery ,所以jquery的 ...
- 0042 MySQL学习笔记-入门--01
基本概念: 数据库DB(database): 数据的仓库,数据的集合,是数据的一种结构化的存储 数据库管理系统DBMS(database management system): 管理数据库的一套软件 ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...