go 运行时:记录在延迟函数中使用Caller和Callers的行为

hlswsv35  于 4个月前  发布在  Go
关注(0)|答案(4)|浏览(51)

你正在使用哪个版本的Go( go version )?

go version go1.10 linux/amd64

这个问题在最新版本中是否重现?

是的,我在 b001ffb 上尝试过。

你正在使用什么操作系统和处理器架构( go env )?

GOARCH="amd64"
GOBIN=""
GOCACHE="/home/ainar/.cache/go-build"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/ainar/go"
GORACE=""
GOROOT="/home/ainar/go/go1.10"
GOTMPDIR=""
GOTOOLDIR="/home/ainar/go/go1.10/pkg/tool/linux_amd64"
GCCGO="/usr/bin/gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build197597232=/tmp/go-build -gno-record-gcc-switches"

你做了什么?

https://play.golang.org/p/Jz6y0GkqTNW

你期望看到什么?

要么

direct: main.go:11
  deferred: main.go:10

要么文档中的 runtime.Caller 提到延迟函数的行号指向 return 之后的行。

你看到了什么?

direct: main.go:11
  deferred: main.go:12

并且在 runtime.Callerruntime.Callers 文档中没有提到 defer
我理解为什么会这样,甚至创建了一个奇怪的解决方法( on Russian SO , on Playground )。但我认为在函数文档中提及这种行为及其基本原因会很好。

ftf50wuq

ftf50wuq1#

简要记录这个是可以的。我只是想评论一下,我认为当前的行为是有道理的。延迟函数在defer语句的点上不会被调用。这就是调用被推迟的地方,而不是它被做出的地方。延迟函数实际上是在推迟函数返回的时候被调用的。这就是runtime.Caller报告的内容。

shstlldc

shstlldc2#

关于 panic 的情况呢?例如 https://play.golang.org/p/LcG_3IOEyr7。我希望 deferred 能打印出 panic 被调用的行,类似于 return 。但它却打印出了 asm_amd64.s:459 ,这似乎并没有什么帮助。
这里的行为对于 Caller 是否已经定义好了呢?我应该为它单独报告一个问题吗?

tnkciper

tnkciper3#

我必须同意打印asm_amd64.s:459是毫无意义的。如果我们可以,应该修复它。

bq3bfh9z

bq3bfh9z4#

关于恐慌的一个问题。

相关问题