go - 是否可以使用默认缩进级别来增加 fmt.print?
问题描述
我正在搞乱创建模块并将它们互连。
在测试行为时,我正在调用调用其他包的包。
是否有一种简单的方法可以通过未来调用的缩进级别来修改 fmt 包的行为。这样父可以在调用子包之前设置缩进级别+1。
这样,当每个函数打印输出时,我可以很容易地在标准输出中看到级联依赖项:
inside main
calling package X
____entering package X
____calling package Y
________package Y hello world
____leaving package X
back in main.
exiting
解决方案
该fmt
软件包不支持此功能。
但是,您可以在 的帮助下访问调用深度runtime.Callers()
,这意味着您甚至不必手动维护缩进“级别”。
“概念证明”
访问调用深度是这样的(它返回0
for main()
,1
对于从main()
等处调用的函数):
func callDepth() int {
pc := make([]uintptr, 100)
return runtime.Callers(6, pc)
}
并使用它,自动压头打印功能:
var tabs = strings.Repeat("\t", 100)
func Println(args ...interface{}) {
fmt.Print(tabs[:callDepth()])
fmt.Println(args...)
}
让我们看看它的实际效果:
func main() {
Println("In main()")
f1()
Println("In main() again")
}
func f1() {
Println("In f1()")
f2()
Println("In f1() again")
}
func f2() {
Println("In f2()")
}
哪些输出(在Go Playground上尝试):
In main()
In f1()
In f2()
In f1() again
In main() again
笔记
我将上述解决方案称为“概念证明”,因为它不是处理所有情况的解决方案。当新的 goroutine 启动时,您必须决定如何处理。当新的 goroutine 启动时,它们不会从 调用main()
,因此传递给的跳过帧runtime.Callers()
应该是 1-less (runtime.Callers(5, pc)
而不是runtime.Callers(6, pc)
)。有关如何检测这一点,请参阅检查函数是否被称为 goroutine。
推荐阅读
- android - NoSuchFieldError:在仅 kotlin 模块中使用 MockWebServer 时的伴侣
- openlayers - 使用 Node 时读取 GeoJson
- javascript - 如何在 MarkLogic 9 中使用 xdmp.Spawn() 进行临时删除?
- windows - 有没有办法使用需要管理员访问权限的 cmd 脚本删除 Windows 中的文件?
- c# - 如何在c#中跳过/暂停发送给观察者的通知
- google-cloud-spanner - Cloud Spanner 中的 USE_ADDITIONAL_PARALLELISM 提示有什么作用
- java - KeycloakWebSecurityConfigurerAdapter 和 JBoss stadalon.xml
- vue.js - 修复第一列时vue可拖动问题我无法移动列
- javascript - 浏览器中的文本区域列大小不一致
- php - laravel 文件上传 - “”文件不存在或不可读