【Golang】go条件编译

这篇具有很好参考价值的文章主要介绍了【Golang】go条件编译。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

交叉编译只是为了能在一个平台上编译出其他平台可运行的程序,Go 作为一个跨平台的语言,它提供的类库势必也是跨平台的,比如说程序的系统调用相关的功能,能根据所处环境选择对应的源码进行编译。让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,这就是另外一个概念叫—条件编译。

在 Go 中,也称之为Build Constraints 编译约束,添加编译约束的方式有2种分别:

  • 编译标签(build tag)
  • 文件后缀

编译标签

编译标签是一种通过在源码文件顶部添加注释,来决定文件是否参与编译的约束方式。其格式如下:

// +build <tags>

注意: // +build 的下一行必须是空行,否则会被解析为包注释。

// +build linux

// main package comment
package main

tags说明:

  • 以空格分开表示 AND
  • 以逗号分开表示 OR
  • !表示 NOT

标签可以指定为以下内容:

- 操作系统,环境变量中 GOOS 的值,如: linux 、 darwin 、 windows 等等。
- 操作系统的架构,环境变量中 GOARCH 的值,如: arch64 、 x86 、 i386 等等。
- 使用的编译器, gc 或者 gccgo 。
- 是否开启CGO, cgo 。
- golang版本号:比如Go Version 1.1为 go1.1 ,Go Version 1.12版本为 go1.12 ,以此类推。
- 其它自定义标签,通过 go build -tags 指定的值。

例如,编译条件为 (linux AND 386) OR (darwin AND (NOT cgo))

// +build linux,386 darwin,!cgo

另外一个文件可以有多个编译约束,比如条件为 (linux OR darwin) AND amd64

// +build linux darwin
// +build amd64

也可以使用 ignore 标签将一个文件从编译中排除。

// +build ignore

文件后缀

除了编译标签,第二种添加编译约束的方法是通过源码文件的文件名实现的,这种方案比构造标签方案更简单。编译器也会根据文件后缀来自动选择编译文件:

$filename_$GOOS.go
$filename_$GOARCH.go
$filename_$GOOS_$GOARCH.go

$filename : 源文件名称。
$GOOS : 表示操作系统,从环境变量中获取。
$GOARCH : 表示系统架构,从环境变量中获取。

后缀的顺序记住不要颠倒,后缀中同时出现系统和架构名时,需要保持 $filename_$GOOS_$GOARCH.go 的顺序。

在 Go 的每个内置库里都有很多以不同系统名结尾的文件。下面是 Go 的 os 内置库源代码的部分截图:
【Golang】go条件编译,golang,开发语言,后端

两种添加编译限制的方式该如何选择?

构建标签和文件名后缀在功能上是重叠的。比如,一个名为 mypkg_linux.go 的文件,再包含构建标签 // +build linux 会显得多余。

通常来说,当只有一个特定平台需要指定时,我们选择文件名后缀的方式。比如:

mypkg_linux.go         // 只在 linux 系统编译
mypkg_windows_amd64.go // 只在 windows amd 64位 平台编译

相反,如果你的文件需要指定给多个平台或体系架构使用,或者你需要排除某个特定平台时,我们选择构建标签的方式。比如:

// 在所有类unix平台编译
// +build darwin dragonfly freebsd linux netbsd openbsd

// 在非Windows平台编译
// +build !windows

go:build 与 +build 的区别

//go:build

是 Go 1.17 中引入的新条件编译指令格式。它旨在替换

// +build

指令。为何要采用新的格式呢?

对比一下新旧格式的区别就知道了:

//go:build linux && amd64 || darwin
// +build linux,amd64 darwin

注意://go:build之间没有空格;// +build之间有空格;
显而易见的优势:

  • go:build 这种格式,对 coder 来说,更容易理解其逻辑组合
  • 与 //go:embed 和 //go:generate 这些命令相比较,格式上进行了统一

错误检查

用go vet命令也可以检测到这个缺少空行的错误,初期可以用这个命令来避免缺少空行的错误

go vet mypkg
mypkg.go:1: +build comment appears too late in file
exit status 1

查看环境

go env

参考

  • Go build tag 实现条件编译

  • 条件编译

  • 由一条编译报错信息,引出两个Go编译的重要知识

  • golang 编译约束 //go:build dev // +build命令,自定义文件后缀编译文章来源地址https://www.toymoban.com/news/detail-681835.html

到了这里,关于【Golang】go条件编译的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Golang:Go语言结构

    在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 表达式 注释 接下来让我们来看下简单的代码,该代码输出了\\\"Hello World!\\\": 让我们来看下以上程序的各个部分: 第一

    2024年02月10日
    浏览(7)
  • 【Golang】Golang进阶系列教程--Go 语言切片是如何扩容的?

    【Golang】Golang进阶系列教程--Go 语言切片是如何扩容的?

    在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。 切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一种引用类型,它有三个属性:指针,长度和容量。 底层源码定义如下: 指针: 指向

    2024年02月14日
    浏览(33)
  • 【Golang】Golang进阶系列教程--Go 语言 map 如何顺序读取?

    Go 语言中的 map 是一种非常强大的数据结构,它允许我们快速地存储和检索键值对。 然而,当我们遍历 map 时,会有一个有趣的现象,那就是输出的键值对顺序是不确定的。 先看一段代码示例: 当我们多执行几次这段代码时,就会发现,输出的顺序是不同的。 首先,Go 语言

    2024年02月14日
    浏览(33)
  • 【Golang】Golang进阶系列教程--Go 语言数组和切片的区别

    【Golang】Golang进阶系列教程--Go 语言数组和切片的区别

    在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。 数组和切片是两个常用的数据结构。它们都可以用于存储一组相同类型的元素,但在底层实现和使用方式上存在一些重要的区别。 Go 中数组的长度是不可改变的

    2024年02月15日
    浏览(9)
  • golang实现webgis后端开发

    golang实现webgis后端开发

    目录 前言 二、实现步骤 1.postgis数据库和model的绑定 2.将pg库中的要素转换为geojson (1)几何定义 (2)将wkb解析为几何类型 (3)定义geojson类型 (4)数据转换 (5)数据返回  2.前端传入的geojson储存到数据库 3、其他功能实现 总结         停更了接近一个月都在研究一门新语言gola

    2024年02月08日
    浏览(9)
  • golang 记录交叉编译sqlite的报错信息 go build -ldflags

    go build -ldflags ‘-s -w --extldflags “-static -fpic”’ -o go-web main.go command-line-arguments /tmp/go-link-1199555067/000015.o: In function ‘unixDlOpen’: /root/go/pkg/mod/github.com/mattn/go-sqlite3@v1.14.6/sqlite3-binding.c:40175: warning: Using ‘dlopen’ in statically linked applications requires at runtime the shared libraries from the gl

    2024年02月04日
    浏览(9)
  • Go语言(Golang)数据库编程

    要想连接到 SQL 数据库,首先需要加载目标数据库的驱动,驱动里面包含着于该数据库交互的逻辑。 sql.Open() 数据库驱动的名称 数据源名称 得到一个指向 sql.DB 这个 struct 的指针 sql.DB 是用来操作数据库的,它代表了0个或者多个底层连接的池,这些连接由sql 包来维护,sql 包会

    2024年02月03日
    浏览(33)
  • 【Golang】VScode配置Go语言环境

    【Golang】VScode配置Go语言环境

    安装VScode请参考我的上一篇博客:VScode安装_㫪548的博客-CSDN博客 接下来我们直接进入正题: Go语言(又称Golang)是一种开源的编程语言,由Google开发并于2009年首次发布。Go语言具有简洁、高效、可靠和易于阅读的特点,被设计用于解决大型项目的开发需求。它结合了静态类型

    2024年02月03日
    浏览(9)
  • 【GoLang】MAC安装Go语言环境

    【GoLang】MAC安装Go语言环境

    小试牛刀 首先安装VScode软件 或者pycharm mac安装brew软件  brew install go 报了一个错误 不提供这个支持  重新brew install go 之后又重新brew reinstall go 使用go version 可以看到go 的版本 使用go env  可以看到go安装后的配置 配置一个环境变量 vim ~/.zshrc,  

    2024年02月15日
    浏览(9)
  • 【Golang】Golang进阶系列教程--为什么 Go 语言 struct 要使用 tags

    【Golang】Golang进阶系列教程--为什么 Go 语言 struct 要使用 tags

    在 Go 语言中,struct 是一种常见的数据类型,它可以用来表示复杂的数据结构。在 struct 中,我们可以定义多个字段,每个字段可以有不同的类型和名称。 除了这些基本信息之外,Go 还提供了 struct tags,它可以用来指定 struct 中每个字段的元信息。 在本文中,我们将探讨为什

    2024年02月15日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包