Go编译指令

许久之前,我曾写过一篇go条件编译的文章,如今又出现了第三种方式,顺便介绍下Go的编译指令。

Go编译指令必须放在文件开头,和代码或普通注释之间要有空行。基本格式是:

//go:指令 [值]

... ...

另一种是用于函数的编译指令,必须紧挨函数声明,不能有空行,格式如下:

//go:指令
func min(a, b int) int

go:build

//go:build功能和// +build一样。只不过在go 1.17这个版本才实现对//go:build的支持。

go\src\go\build\constraint\expr.go中有一段注释:

// This package parses both the original “// +build” syntax and the “//go:build” syntax that will be added in Go 1.17.
// The parser is being included in Go 1.16 to allow tools that need to process Go 1.17 source code
// to still be built against the Go 1.16 release.
// See https://golang.org/design/draft-gobuild for details about the “//go:build” syntax.

为了兼容旧版本,//go:build xxx后必须同时有// +build xxx,否则编译器就会报错。

//go:build comment without // +build comment

示例:

//go:build windows
// +build windows

package test

func init() {
    println("I'm here.")
}

在Windows环境运行,会看到"I’m here."输出,切换到Linux环境,该文件不会参与编译,也就不会有输出。

Go编译指令

编译指令说明target
go:build同+build文件
go:norace禁止竞争检查函数
go:nosplit禁止栈分裂。Go会在函数调用时插入栈分裂代码来动态调整栈大小,防止栈溢出。一个确定栈不会溢出的函数可以加上这个编译指令。函数
go:noinline禁止函数内联。函数
go:noescape禁止逃逸分析。只有声明的Go函数(汇编实现)

以上是我们可能可以用到的部分编译指令。对于Go编译指令,日常写代码基本用到的不多。它们目的指导编译,也就是写给编译器看的。对于1.17以上的Go版本,go:build可能用到的多一点。至于提升性能,场景就更少了,一般更应该先想想代码写的是否有问题。

更多编译指令可以参考:

Command compile - The Go Programming Language

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值