Go编译指令

Go编译指令,第1张

许久之前,我曾写过一篇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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/995219.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存