条件编译

简介

条件编译指的是只编译满足条件的代码段。
      很多情况下我们的程序需要根据不同阶段、不同的使用场景做对应的设置或约束,代码中如果写了太多的判断逻辑会显得非常冗余,且可读性、可维护性也比较差,程序体积也会增加。若采用条件编译,只编译满足条件的代码段,则可以有效地避免到处写相同的判断逻辑程序体积也能够显著减小(打个比方:if…else if…else 这3个分支的逻辑仅编译满足条件的分支逻辑)。
      举个例子
      某系统设计了两种模式,一种是普通模式,另一种是安全模式,系统同时只能使用一种模式。普通模式密码直接用md5,而安全模式密码用aes加密算法。这时候如果在代码里面判断当前模式再做对应的处理,可以实现目的,但不够优雅,若后续很多地方依赖于密码操作,则到处都需要先判断模式再做密码处理,写了不少冗余代码不说,还降低了可读性和可维护性(后续如有更多模式,还得到处修改),项目体积也增大了。
      如果基于条件编译来构建代码,则根本不用到处写判断,只需要根据不同模式划分文件,不同模式外层调用逻辑相同但底层的逻辑不同,对于调用层而言调用的是相同的常量、变量、函数,但是由于条件编译的关系在编译期已经根据条件编译了对应的代码,此时调用层就能够根据需要去调用并执行对应的逻辑。就解决了上述到处写判断逻辑的各种问题。

说明

Golang中通过在.go文件声明包名之前定义如下注释:
//+build tagI,tagII tagIII,tagIV ...1、上述注释具有标签的意义,编译时根据指定标签编译对应的文件;
2、该注释要求与上下内容至少空一行,避免被当成纯注释信息而无法参与条件编译;
3、标签之间的逻辑意义:
3.1、逗号[,]或换行(另起一行写/ /+build)表示And,即 &&;
3.2、空格[ ]表示Or,即 ||;
3.3、感叹号[!]表示Not,即 !;
ex:
//+build aa,bb cc,dd
逻辑意义(aa And bb) Or (cc And dd)
//+build aa bb
//+build cc
逻辑意义(aa Or bb) And cc
//+build aa,!bb
逻辑意义 aa And (Not bb)

示例


正常情况下代码中同一个包内不允许重复定义常量、变量、函数,否则会报重定义的错误,但由于条件编译的关系,这两个文件同时只能满足一个匹配条件,也就是说同时只能有一个参与编译,因此不会产生冲突。

使用命令:go build -tags develop xxx 即可编译含有develop标签的文件,而标签不满足的则不参与编译,无设置标签的均作为公共文件默认参与编译;

结果

使用develop为tag:

使用product为tag:

由此可见,同一个包中即便有若干文件中定义了同名全局常量、变量、函数等,只要能够满足编译条件,就能够根据条件编译目标代码段。条件编译在不同阶段、不同场景下的作用还是非常凸显的。

编辑器(此处只介绍Goland)

若文件加上了标签的注释,则Goland也会有一定的适配。

如上图,若标签不匹配则会出现上述提示信息,只要如下图设置标签即可识别。

Tip:此处要提一下,设置标签的时候windows、linux等平台,amd64、386等CPU架构都是有意义的,编译时与GOOS和GOARCH相关,作用与文件名携带后缀 _windows_amd64.go 或 _linux_amd64.go 一致,可参考:Golang交叉编译

Golang条件编译相关推荐

  1. golang不编译.html,golang之条件编译

    Go语言能够经过go/build包里定义的tags和命名约定来让Go的包能够运行不一样的代码.html 标签编译 在源代码里添加标注,一般称之为编译标签(build tag).编译标签采用靠近源代码文 ...

  2. golang不编译.html,Golang 编译 条件编译

    条件编译: 标签编译:( build tag ) // +build { GOOS }, { GOOS }, { !GOOS } // +build (linux AND 386) OR (darwi ...

  3. golang下的条件编译

    本文转自  使用go build 进行条件编译 http://blog.csdn.net/varding/article/details/12675971 当我们编写的Go代码依赖特定平台或者cpu架 ...

  4. 我在暴躁同事小张的胁迫下学会了Go的交叉编译和条件编译

    今天继续关于Go开发经验的分享,这次的主题是关于Go的交叉编译和条件编译,伴随着我对自己打不过.惹不起的壕同事小张还有运维们的碎碎念. 交叉编译 交叉编译是用来在一个平台上生成另一个平台的可执行程序. ...

  5. 客观评价golang的优缺点

    Go 语言的优点,缺点和令人厌恶的设计 关注公众号 风色年代(itfantasycc) 300G微服务资料等你拿! Go 语言的优点,缺点和令人厌恶的设计 - Go语言中文网 - Golang中文社区 ...

  6. 高性能Golang研讨会【精】

    by Dave Cheney 概观 本次研讨会的目标是为您提供诊断Go应用程序中的性能问题并进行修复所需的工具. 通过这一天,我们将从小工作 - 学习如何编写基准,然后分析一小段代码.然后走出去讨论执 ...

  7. golang之Gin项目脚手架搭建

    GoWeb之Gin项目脚手架搭建 一.Gin框架简单使用 Gin项目地址:https://github.com/gin-gonic/gin 文档地址:https://www.kancloud.cn/s ...

  8. 年终盘点!2017年超有价值的Golang文章

    由于微信链接没办法直接点击,所以后面这些链接都是需要大家自己copy打开 马上就要进入2018年了,作为年终的盘点,本文列出了一些2017年的关于Go编程的一些文章,并加上简短的介绍. 文章排名部分先 ...

  9. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

最新文章

  1. python如何实现多进程_Python实现多进程的四种方式
  2. 工业机器人几个自由度_取件冲压上下料机械手和六自由度工业机器人805A
  3. python教程实例-Python实例教程
  4. mysql忘记root密码解决办法
  5. MySQL主从复制性能优化
  6. 优化委托的 DynamicInvoke
  7. SpringSecurity认证
  8. python继承和多态_Python 简明教程 --- 21,Python 继承与多态
  9. 如何在不同开发语言中使用绑定变量_linux C/C++服务器后台开发面试题总结(编程语言篇)...
  10. 【英语学习】【WOTD】horticulture 释义/词源/示例
  11. 树莓派指定python2编译_在树莓派上编译安装ROS2
  12. HTML框架分析及应用
  13. 爱国者(aigo)U391 128G 固态U盘制作PE启动盘
  14. C++命名空间的定义与使用
  15. nowcoder 鹏
  16. 第13章 Python建模库介绍--Python for Data Analysis 2nd
  17. WINCE 实用技巧 之 创建快捷方式详解
  18. java aes 工具类_Java中的AES加解密工具类:AESUtils
  19. PostgreSQL扫描方法综述
  20. Java,完全一头雾水,求大shen们指点

热门文章

  1. STM32开发指南阅读记录
  2. EVO工具的安装和使用(window10)
  3. python身份证号码解析编程_[宜配屋]听图阁
  4. ASP.NET获取请求的url信息汇总
  5. Mastercam9.1三四五轴编程后处理视频教程100讲
  6. Double.parseDouble是什么?
  7. html 子页刷新父页面刷新,子框架页刷新父页面其它框架的办法
  8. Android开发从入门到精通(1)
  9. Linux内核TC工具链路带宽设计--HTB队列规定及简单的过滤器介绍
  10. Android监听系统通知