网站有几个后台,广西网站建设价格多少,公众号开发主要做什么,北京中交建设公司网站交叉编译只是为了能在一个平台上编译出其他平台可运行的程序#xff0c;Go 作为一个跨平台的语言#xff0c;它提供的类库势必也是跨平台的#xff0c;比如说程序的系统调用相关的功能#xff0c;能根据所处环境选择对应的源码进行编译。让编译器只对满足条件的代码进行编译… 交叉编译只是为了能在一个平台上编译出其他平台可运行的程序Go 作为一个跨平台的语言它提供的类库势必也是跨平台的比如说程序的系统调用相关的功能能根据所处环境选择对应的源码进行编译。让编译器只对满足条件的代码进行编译将不满足条件的代码舍弃这就是另外一个概念叫—条件编译。 在 Go 中也称之为Build Constraints 编译约束添加编译约束的方式有2种分别
编译标签(build tag)文件后缀
编译标签
编译标签是一种通过在源码文件顶部添加注释来决定文件是否参与编译的约束方式。其格式如下
// build tags注意 // build 的下一行必须是空行否则会被解析为包注释。
// build linux// main package comment
package maintags说明
以空格分开表示 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 内置库源代码的部分截图
两种添加编译限制的方式该如何选择
构建标签和文件名后缀在功能上是重叠的。比如一个名为 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 !windowsgo: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命令自定义文件后缀编译