go build tags使用
转载请注明出处:
在 Go 语言中,构建标签(Build Tags)是一种用于条件编译的机制,可以帮助开发者根据不同的条件选择性地编译特定的代码块。它们在处理多平台和多环境的代码时特别有用,例如为不同操作系统、架构或配置选择特定的实现。
1. 构建标签的作用
- 条件编译:允许开发者通过标签来控制哪些文件在特定的构建条件下被编译。
- 环境适应性:可以根据不同的操作系统或架构编译不同的实现,增强代码的可移植性。
- 简化代码管理:通过将不同实现分散到不同的文件中,可以更清晰地管理和维护代码。
2. 如何使用构建标签
2.1 基本语法
构建标签位于源文件的开头,在 package 声明之前,使用 // +build 语法来定义。例如:
// +build linux
package main
import "fmt"
func main() {
fmt.Println("Hello, Linux!")
}
2.2 多个标签
可以在同一行中定义多个标签,以逻辑与的方式组合:
// +build linux amd64
package main
import "fmt"
func main() {
fmt.Println("Hello, Linux 64-bit!")
}
也可以通过换行使用多行来定义不同的标签,以逻辑或的方式组合:
// +build linux
// +build amd64
package main
import "fmt"
func main() {
fmt.Println("Hello, Linux or AMD64!")
}
2.3 忽略构建标签
要使一个文件在指定的平台上不被编译,可以使用 ! 符号。例如,下面的文件将不会在 Windows 平台上编译:
// +build !windows
package main
import "fmt"
func main() {
fmt.Println("This won't run on Windows!")
}
3. 创建条件编译的示例
下面是一个使用构建标签的完整示例,展示如何根据操作系统选择不同的实现。
3.1 创建目录和文件
首先,创建一个新的 Go 项目目录:
mkdir buildtags_example
cd buildtags_example
然后创建三个 Go 源文件,分别用于不同的操作系统。
文件结构:
buildtags_example/
│
├── main.go
├── print_linux.go // Linux 平台实现
└── print_windows.go // Windows 平台实现
3.2 编写代码
- main.go:
package main import "fmt" func main() {
PrintGreeting()
} - print_linux.go:
// +build linux package main import "fmt" func PrintGreeting() {
fmt.Println("Hello from Linux!")
} - print_windows.go:
// +build windows package main import "fmt" func PrintGreeting() {
fmt.Println("Hello from Windows!")
}
3.3 编译和运行
根据不同的操作系统编译和运行程序。在 Linux 上:
go run .
输出将是:
Hello from Linux!
在 Windows 上:
go run .
输出将是:
Hello from Windows!
4. 总结
- 构建标签 是 Go 中灵活的条件编译机制,可以帮助根据不同的环境要求划分和管理代码。
- 使用方法:
- 在源文件头部定义
// +build标签。 - 支持使用逻辑与和或组合多个标签。
- 通过
!符号来忽略某些构建标签。
- 在源文件头部定义
go build tags使用的更多相关文章
- go build -tags 的使用
go build 使用tag来实现编译不同的文件 go-tooling-workshop 中关于go build的讲解可以了解到go bulid的一些用法,这篇文章最后要求实现一个根据go bulid ...
- Android系统build.prop文件
# begin build properties (开始设置系统性能) # autogenerated by buildinfo.sh (通过设置形成系统信息) ro.build.id=GRI40 ( ...
- Build类
在开发中 我们有时候会需要获取当前手机的系统版本来进行判断,或者需要获取一些当前手机的硬件信息. android.os.Build类中.包括了这样的一些信息.我们可以直接调用 而不需要添加任何的权限和 ...
- build.prop修改详细说明
用RE进入/system/挂载读写,找到build.prop复制到/sdcarrd进行修改比较保险.也可以挂载读写后,直接选择用文本编辑器打开,进行编辑.乱改有风险,修改需谨慎.1.# begin b ...
- android手机状态解释,比方android.os.Build.VERSION.SDK
//BOARD 主板 String phoneInfo = "BOARD: " + android.os.Build.BOARD; phoneInfo += ", BOO ...
- android修改getprop读取到的ro.build.fingerprint属性
在build/tools/buildinfo.sh中定义ro.build.fingerprint=$BUILD_FINGERPRINT. 然后在build/core/Makefile中给BUILD_F ...
- Android Rom build.prop文件详解
# begin build properties # autogenerated by buildinfo.sh #以下内容由脚本在编译时自动产生 ro.build.id=6.7.7_97 ...
- [置顶] Android系统移植与调试之------->build.prop文件详细赏析
小知识:什么是build.prop? /system/build.prop 是一个属性文件,在Android系统中.prop文件很重要,记录了系统的设置和改变,类似於/etc中的文件.这个文件是如 ...
- Android Build.VERSION.SDK_INT兼容介绍
尽管Android向下兼容不好,但是一个程序还是可以在多个平台上跑的.向下兼容不好,接口改变,新的平台上不能用旧的API,旧的平台更不可能用新的API,不等于一个平台需要一个APK.可以在高SDK上开 ...
- Android之build.prop属性详解
注:本篇文章是基于MSD648项目(AndroidTV)的prop进行说明. Android版本:4.4.4 内核版本:3.10.86 1.生成build.prop build.prop的生成是由ma ...
随机推荐
- ASP.NET Core Library – Excel 读写
前言 以前写过 EPPlus 的笔记, 但后来 EPPlus 开始收费了.... (这好像是 .NET 生态的宿命) 在找替代方案中看中了微软的 Open XML SDK. 但经过一番折腾, 它确实太 ...
- sign与unsigned的原理、数据存储与硬件的关系
目录 关键字unsigned和signed 数据在计算机中的存储 原码 与 补码的转化与硬件关系 原,反,补的原理: 整型存储的本质 变量存取的过程 类型目前的作用 十进制与二进制快速转换 大小端字节 ...
- 学习问题记录:RocketMQ集成到SpringBoot后,消费者无法自动进行消息消费。
情况说明 在SpringBoot中集成了RocketMQ,实践过程中,通过RocketMQ DashBoard观察,生产者可以正常将进行消息提交:通过日志及DashBoard观察,消费者成功在Rock ...
- Filter——过滤器
Filter Filter 快速入门 Filter 执行流程 1.放行前,对 request 数据进行处理 2.放行后,对 response 数据进行处理 ...
- 加快 hdfs block 块复制的参数调整
共涉及三个参数: dfs.namenode.replication.max-streams 30 => 70 dfs.namenode.replication.max-streams-hard- ...
- template fastread
昨天梦到一种快读,你给他传多少参,他就读多少数 今天学了折叠表达式和隐式转换,现在来把这玩意实现一下 特化函数 void read(int) 读入一个整数 void read(char&[], ...
- Linux下执行文件删除的操作{确认!确认! 确认!再三确认!}
ubuntu 删除文件夹命令 rm -r 文件名字 ---> 强制删除XXX文件 rm -f 文件名字 ---> 强制删除XXX文件(centos) 注: linux 中, 强制删除文件的 ...
- std::make_shared
std::make_shared 是 C++11 引入的一个标准库函数,用于创建一个 std::shared_ptr,并在堆上分配所需的对象. 它的功能是将对象的创建和 shared_ptr 的初始化 ...
- 何为ORM框架?和ADO.NET 对比
百度:ORM(Object Relational Mapping)框架采用元数据来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中.简单理解为一种框架的格式 . 只 ...
- 强化学习笔记之【SAC算法】
强化学习笔记之[SAC算法] 前言: 本文为强化学习笔记第四篇,第一篇讲的是Q-learning和DQN,第二篇DDPG,第三篇TD3 TD3比DDPG少了一个target_actor网络,其它地方有 ...