go:build与+build——构建约束

1. 前言

在学习https://github.com/kardianos/service库源码时,发现调用时,可以自动识别当前操作系统,并能执行对应方法。

方法调用如下图:

  • windows

kardianos service调用_win

  • darwin(MacOS操作系统)

kardianos service调用

原以为是使用runtime.GOOS进行判断,于是我搜索全局,结果没有找到,百度搜索后发现了注释中的\\+build,继续搜索相关+build内容,查找到go:build

kardianos service源码

2. 介绍

官方讲解:https://pkg.go.dev/cmd/go#hdr-Build_constraints

//go:build是Go 1.17中引入的新的条件编译指令。它旨在取代// +build指令

3. 使用

目前有两种方法来使用构建约束

3.1. 文件名加后缀

文件名后缀规则,有两条规则:

  1. 文件名_GOOS.go
  2. 文件名_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

gobuild_win

  • darwin(MacOS操作系统)

gobuild_mac

4. 总结

我们使用此方法可以实现多个操作系统执行不同的函数,而不用在同一个函数中来判断操作系统,非常方便

作者: Hountry_Liu
本文采用 CC BY-NC-SA 4.0 协议
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00