1、背景
今天无意中看到一套代码,关于获取系统实时运行状况的开源库,里面没有任何关于系统选择,但是一个包下面,以不同系统名字结尾,例如*_linux.go,*_darwin.go结尾,而且文件内的方法又是同名,众所周知,go的同一包下面,如果方法同名是会报错的,于是乎特别好奇, why?
2、解决疑惑-构建约束
带着疑惑,我去网上搜了一下,了解到了一个新的名词 : build constraints(构建约束)
,其实这个在c++里面还是经常会看到,但是作为一个go开发者,现在才知道????♀ 。️看官方解释:
里面清除描述了,编译便签(build tags 勉强翻译哈),可以让你在构建的时候自动选择那些文件编译,那些文件不编译,并且不止作用于go文件,如果要用,就必须出现在在文件开头,而且之后还要有空行。
3、如今了解了有这个东西,那这个build targs 到底有哪些呢,怎么用呢?
也去网上搜了下这些tags: + (编译)、 !(忽略)...
样子长下面这样
当然还有其他的些约束,例如指定go版本等等,使用时再做细细研究吧!
4、解决了什么问题?
这个主要解决了代码解耦问题,例如我们写的采集器,会针对不同的系统都有要一套采集代码,返回结果是一样的。如果采用这中方式,只需针对不同的系统要增加文件即可。完美解决了以前都是先判断系统,然后switch的方式。
有疑问加站长微信联系(非本文作者)