1. 前言
在学习https://github.com/kardianos/service
库源码时,发现调用时,可以自动识别当前操作系统,并能执行对应方法。
方法调用如下图:
- windows
- darwin(MacOS操作系统)
原以为是使用runtime.GOOS
进行判断,于是我搜索全局,结果没有找到,百度搜索后发现了注释中的\\+build
,继续搜索相关+build
内容,查找到go:build
。
2. 介绍
官方讲解:https://pkg.go.dev/cmd/go#hdr-Build_constraints
//go:build
是Go 1.17中引入的新的条件编译指令。它旨在取代// +build
指令
3. 使用
目前有两种方法来使用构建约束
3.1. 文件名加后缀
文件名后缀规则,有两条规则:
文件名_GOOS.go
文件名_GOOS_GOARCH.go
GOOS
表示操作系统,比如windows、linux等;GOARCH
表示平台比如amd64、386等。关于支持的操作系统和平台,在src/go/build/syslist.go
文件中有详细定义。
const goosList = "aix android darwin dragonfly freebsd hurd illumos ios js linux nacl netbsd openbsd plan9 solaris windows zos "
const goarchList = "386 amd64 amd64p32 arm armbe arm64 arm64be ppc64 ppc64le mips mipsle mips64 mips64le mips64p32 mips64p32le ppc riscv riscv64 s390 s390x sparc sparc64 wasm "
3.2. 编译标签
通过//go:build
实现。加上标签后,你会发现可以在同一个package,取相同的函数名。
- main.go
package main
import "fmt"
func main() {
fmt.Println(cal(5, 3))
}
- cal_add_windows.go
//go:build windows
package main
func cal(a, b int) int {
return a + b
}
- cal_multi_darwin.go
//go:build darwin
package main
func cal(a, b int) int {
return a * b
}
3.2.1. build
编译打包不同系统的文件
- windows
bee pack -be GOOS=windows
- darwin(MacOS操作系统)
bee pack -be GOOS=darwin
3.2.1. 效果
- windows
- darwin(MacOS操作系统)
4. 总结
我们使用此方法可以实现多个操作系统执行不同的函数,而不用在同一个函数中来判断操作系统,非常方便