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等等。

时间: 2024-10-13 12:17:09

Go build constraints的相关文章

说说Golang的使用心得

13年上半年接触了Golang,对Golang十分喜爱.现在是2015年,离春节还有几天,从开始学习到现在的一年半时间里,前前后后也用Golang写了些代码,其中包括业余时间的,也有产品项目中的.一直有想法写点Golang相关的总结或者感想,决定还是在年前总结下吧.注明下:我只是Golang的喜好者,不是脑残粉,也无意去挑起什么语言之争. 特性少,语法简单.GO是崇尚极简主义的,提倡少即是多.这点在它的Spec上尤其凸显,一下午的时间绝对可以看完.GO的特性很少,很多GO的使用者都反馈,GO的关

Golang编程经验总结

如何选择web框架: 首先Golang语言开发web项目不一定非要框架,本身已经提供了Web开发需要的一切必要技术.当然如果想要ruby里面Rail那种高层次全栈式的MVC框架, Golang里面暂时没有,但是不是所有人都喜欢这种复杂的框架.Golang里面一些应用层面的技术需要自己去组装,比如session,cache, log等等. 可选择的web框架有martini, goji等,都是轻量级的. Golang的web项目中的keepalive 关于keepalive, 是比较复杂的, 注意

微职位Golang开发工程师学习分享韩晓东

18年5月份接触了51CTO推出的微职位Go课程,对Golang十分喜爱.通过张长志老师的视频讲解,前后4个月的学习时间.也用Golang写了些简单的代码和例子,其中包括业余时间的,也有项目中的.今天写点Golang相关的总结,仅供各位同学参考. 特性少,语法简单.GO是崇尚极简主义的,提倡少即是多.这点在它的Spec上尤其凸显,一下午的时间绝对可以看完.GO的特性很少,很多GO的使用者都反馈,GO的关键字至少完全可以记在大脑里.同时它的语法极为简单,而且语义清晰. 部署方便.GO是一个强类型静

go tags

BuildTags smallnest edited this page on 6 Feb 2018 · 3 revisions 为了避免引入不必要的库, rpcx采用了 Go 条件编译 的特性, 你可以只引入必要的特性. 比如你只使用 etcd 作为注册中心的时候, 你不希望引入 consul.zookeeper相关的库,你需要在 Go BuildTags中指定 etcd. 如果不指定 tags,可能会出现下面的错误. .server.go:37:8: undefined: serverplu

学习golang的条件编译

昨天学习了go generate,今天学习另外一个知识点,一样是跟注释有关的知识点.golang的条件编译,也叫编译约束(build constraints). 应用场景 条件编译可以在适应不同平台操作系统的代码上体现.不同的操作系统平台,对某些特性的支持不太一样,但是往往在业务层面上的代码不会去关注,所以需要对底层的代码进行一些封装.比如,Windows和Linux的home目录是不一样的,而我们的业务需要读取home目录,那此时我们就可以用条件编译来达到效果. 条件编译的两种形式 条件编译可

Auto Layout Guide----(二)-----Auto Layout Without Constraints

Auto Layout Without Constraints 没有约束的自动布局 Stack views provide an easy way to leverage the power of Auto Layout without introducing the complexity of constraints. A single stack view defines a row or column of user interface elements. The stack view a

Error applying BeanValidation relational constraints错误的解决

错误示例: Exception in thread "main" org.hibernate.HibernateException: Error applying BeanValidation relational constraintsat org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.applyRelationalConstraints(BeanValidationIntegrator.java:219)at o

使用ConstraintLayout构建响应式UI(Build a Responsive UI with ConstraintLayout)

原文:https://weiyf.cn/2017/03/10/Build%20a%20Responsive%20UI%20with%20ConstraintLayout/ 原文:http://www.jianshu.com/p/f61227a2775f 简介: ConstraintLayout不需要使用嵌套布局就可以让我们去构建一个大而复杂的布局,他与RelativeLayout很相似,所有在里面的View的布局方式取决于View与View之间的关系和父布局.但是他比RelativeLayout

Laravel API Tutorial: How to Build and Test a RESTful API

With the rise of mobile development and JavaScript frameworks, using a RESTful API is the best option to build a single interface between your data and your client. Laravel is a PHP framework developed with PHP developer productivity in mind. Written