许久之前,我曾写过一篇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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)