标题
[golang] noescape 的作用是:禁止逃逸 逃逸是什么 +godebug cgocheck
clq
浏览(20) +
2025-03-07 00:26:08 发表
编辑
关键字:
[2025-03-07 00:53:06 最后更新]
[golang] noescape 的作用是:禁止逃逸 逃逸是什么
//go:noescape
noescape 的作用是:禁止逃逸,而且它必须指示一个只有声明没有主体的函数。
逃逸是什么?
Go 相比 C、C++ 是内存更为安全的语言,主要一个点就体现在它可以自动地将超出自身生命周期的变量,从函数栈转移到堆中,逃逸就是指这种行为。
ps. 官方文档如下,看一下,挺有用的
https://pkg.go.dev/cmd/compile#hdr-Compiler_Directives
--------------------------------------------------------
https://zhuanlan.zhihu.com/p/371187314
//go:noescape 或 //go:nosplit
https://segmentfault.com/a/1190000016743220
https://segmentfault.com/a/1190000016354799#articleHeader2
======================================================================
下面是 godebug 环境变量的知识
在 Go 中,GODEBUG=cgocheck=0 是一个运行时环境变量,而不是编译时选项。它的作用是控制 Go 运行时对 CGO 调用的指针检查行为。这种检查需要在运行时动态进行,因此无法在编译时直接固化到生成的二进制文件(如 DLL)中。
//----
https://zhuanlan.zhihu.com/p/3455764382
3.1. //go:debug
指令
从Go 1.21开始,可以在源代码中使用//go:debug指令来设置GODEBUG的值。这些指令必须放在文件的顶部,在package语句之前。例如:
//go:debug panicnil=1
//go:debug asynctimerchan=0
package main
这些指令会在编译时被处理,并影响生成的二进制文件的行为。
3.2 go.mod中的godebug指令
从Go 1.23开始,可以在go.mod文件中使用godebug指令来设置GODEBUG的默认值,例如:
// go.mod
godebug (
default=go1.21
panicnil=1
asynctimerchan=0
)
这个配置会影响整个模块(module)的默认GODEBUG设置。
3.3 优先级和应用范围
那么GODEBUG、//go:debug以及go.mod中的godebug指令的优先级关系是怎样的呢?
显然,环境变量GODEBUG优先级最高,因为它可以在运行时覆盖其他设置,适用于临时调试或特定运行环境。
go:debug指令优先级次之,通常应用于特定的main包,适用于对特定程序进行精细控制。
而go.mod中的godebug指令优先级最低,为整个模块设置默认值,适用于项目级别的配置。
基于上述关系,我们来看看一个Go应用GODEBUG设置的默认值的确定过程。当没有显示设置GODEBUG环境变量时,各设置的默认值按以下顺序确定:
首先查看用于构建程序的Go工具链(版本)的默认值。
然后根据go.mod或go.work中声明的Go版本(go version)进行调整。
之后应用go.mod中的godebug指令(如果有的话)。
最后是//go:debug,通常仅应用于main module。
例如,如果一个项目的go.mod声明了go 1.20,那么即使使用Go 1.21工具链编译,也会默认使用panicnil=1(即允许panic(nil))。
不过有特殊情况需要注意,比如对于声明早于Go 1.20版本的项目,GODEBUG默认值会被配置为匹配Go 1.20的行为,而不是更早的版本;又比如在测试环境中,*_test.go文件中的//go:debug指令会被视为测试主包的指令等。
这么看规则还是蛮复杂的,那么编译后待执行的程序的默认GODEBUG的设置究竟是什么呢?我们可以通过go version -m来查看,以gopls v0.16.2为例:
$go version -m /Users/tonybai/Go/bin/gopls
/Users/tonybai/Go/bin/gopls: go1.23.0
path golang.org/x/tools/gopls
mod golang.org/x/tools/gopls v0.16.2 h1:K1z03MlikHfaMTtG01cUeL5FAOTJnITuNe0TWOcg8tM=
dep github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
dep github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
dep golang.org/x/exp/typeparams v0.0.0-20221212164502-fae10dda9338 h1:2O2DON6y3XMJiQRAS1UWU+54aec2uopH3x7MAiqGW6Y=
dep golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
dep golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
dep golang.org/x/telemetry v0.0.0-20240829154258-f29ab539cc98 h1:Wm3cG5X6sZ0RSVRc/H1/sciC4AT6HAKgLCSH2lbpR/c=
dep golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
dep golang.org/x/tools v0.22.1-0.20240829175637-39126e24d653 h1:6bJEg2w2kUHWlfdJaESYsmNfI1LKAZQi6zCa7LUn7eI=
dep golang.org/x/vuln v1.0.4 h1:SP0mPeg2PmGCu03V+61EcQiOjmpri2XijexKdzv8Z1I=
dep honnef.co/go/tools v0.4.7 h1:9MDAWxMoSnB6QoSqiVr7P5mtkT9pOc1kSxchzPCnqJs=
dep mvdan.cc/gofumpt v0.6.0 h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo=
dep mvdan.cc/xurls/v2 v2.5.0 h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8=
build -buildmode=exe
build -compiler=gc
build DefaultGODEBUG=asynctimerchan=1,gotypesalias=0,httplaxcontentlength=1,httpmuxgo121=1,httpservecontentkeepheaders=1,panicnil=1,tls10server=1,tls3des=1,tlskyber=0,tlsrsakex=1,tlsunsafeekm=1,winreadlinkvolume=0,winsymlink=0,x509keypairleaf=0,x509negativeserial=1
build CGO_ENABLED=1
build CGO_CFLAGS=
build CGO_CPPFLAGS=
build CGO_CXXFLAGS=
build CGO_LDFLAGS=
build GOARCH=amd64
build GOOS=darwin
build GOAMD64=v1
我们看到其DefaultGODEBUG如下:
DefaultGODEBUG=asynctimerchan=1,gotypesalias=0,httplaxcontentlength=1,httpmuxgo121=1,httpservecontentkeepheaders=1,panicnil=1,tls10server=1,tls3des=1,tlskyber=0,tlsrsakex=1,tlsunsafeekm=1,winreadlinkvolume=0,winsymlink=0,x509keypairleaf=0,x509negativeserial=1
相对于GOEXPERIMENT的flags的数量,GODEBUG的设置项更多,下面我们根据go官方资料整理一个GODEBUG设置项列表供大家参考(信息截至2024.10.7)。
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.