首页 > 解决方案 > 是否可以使用默认缩进级别来增加 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 

标签: gogofmt

解决方案


fmt软件包不支持此功能。

但是,您可以在 的帮助下访问调用深度runtime.Callers(),这意味着您甚至不必手动维护缩进“级别”。

“概念证明”

访问调用深度是这样的(它返回0for 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


推荐阅读