为了账号安全,请及时绑定邮箱和手机立即绑定

golang项目中使用条件编译

标签:
Go

golang项目中使用条件编译

yuchen16---原文地址

C语言中的条件编译

golang中没有类似C语言中条件编译的写法,比如在C代码中可以使用如下语法做一些条件编译,结合宏定义来使用可以实现诸如按需编译release和debug版本代码的需求

#ifndef#define...

#end

 

golang中的条件编译

golang支持两种条件编译的实现方式

  • build tags

  • 文件后缀

1. 通过Build tags实现

build tags 是通过代码注释的形式实现的,要写在文件的最顶端;

go build指令在编译项目的时候会检查每一个文件的build tags,用来决定是编译还是跳过该文件

build tags遵循以下规则

  1. 不同tag域之间用空格区分,他们是OR关系

  2. 同一tag域之内不同的tag用都好区分,他们是AND关系

  3. 每一个tag都由字母和数字构成,!开头表示条件“非”

示例:

// +build darwin freebsd netbsd openbsd

约束此文件只能在支持kqueue的BSD系统上编译

一个文件可能包含多行条件编译注释,比如:

// +build linux darwin// +build 386

约束该文件在linux/386 或 darwin/386平台编译

需要注意的点

tag注释和包声明必须用空行隔开,比如下面的写法是错误的,编译器会把第一行作为包说明来处理,而不是build tags

1 // +build !linux2 package mypkg // wrong

 

正确的写法如下:

1 // +build !linux2 3 package mypkg // correct

 

编译方法:

只需要在go build指令后用-tags指定编译条件即可

go build -tags linux

 

2. 通过文件名后缀实现

具有_$GOOS.go后缀的go文件在编译的时候会根据当前平台来判断是否将该文件导入并编译;同样适用于处理器架构判断 _$GOARCH.go

两者可以结合起来使用,形式为: _$GOOS_$GOARCH.go

示例:

mypkg_freebsd_arm.go // 只在 freebsd/arm 编译mypkg_plan9.go       // 只在 plan9 编译

 

文件名必须提供,如果只由后缀的文件名会被编译器忽略,比如:

_linux.go
_freebsd_386.go

 

这两个文件会被编译器忽略,因为以下划线开头的文件都会被忽略

参考资料:

  1. https://dave.cheney.net/2013/10/12/how-to-use-conditional-compilation-with-the-go-build-tool


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消