golang编译器的//go:解析

本文介绍了Go编译器中的一些特殊指令,如//go:noescape用于禁止逃逸分析,//go:nosplit用于禁用堆栈溢出检查,//go:linkname用于链接到特定的变量或函数,//go:nowritebarrierrec和//go:yeswritebarrierrec控制写屏障,//go:noinline防止函数内联,以及//go:norace跳过竞态检测。这些指令在特定场景下对代码优化和安全性具有重要作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在阅读golang源码时经常会遇到以//go:开头的注释,其目的就是告诉编译器如何编译这段代码。

//go:noescape

noescape的作用就是禁止逃逸,指定文件中的下一个声明必须是不带主题的func(意味着该声明的实现不是用Go编写的),不允许将作为参数传递的任何指针逃逸到堆或函数的返回值上。

runtime/os_dragonfly.go
//go:noescape
func lwp_create(param *lwpparams) int32

//go:noescape
func sigaltstack(new, old *stackt)

//go:noescape
func sigaction(sig uint32, new, old *sigactiont)

//go:nosplit

指定文件中声明的函数不得进行堆栈溢出检查,这是一个在不安全抢占调用goroutine时常用的做法。

runtime/chan.go
//go:nosplit
func chansend1(c *hchan, elem unsafe.Pointer) {
	chansend(c, elem, true, getcallerpc())
}

//go:linkname localname [importpath.name]

使用[importpath.name]作为源代码中声明的localname的变量或函数。由于该指令可以破坏类型系统和包模块化。因此只有引用了 unsafe 包才可以使用。
举个例子,在time包中定义了runtimeNano的函数

time/time.go
//go:linkname r
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值