Go 是否可以使用默认缩进级别增加fmt.print?

Go 是否可以使用默认缩进级别增加fmt.print?,go,gofmt,Go,Gofmt,我正在混乱地创建模块并将它们链接起来 当测试行为时,我调用调用其他包的包 有没有一种简单的方法可以通过未来调用的缩进级别来修改fmt包的行为。 这样父级可以在调用子包之前设置缩进级别+1 这样,当每个函数输出输出时,我可以很容易地看到标准输出中的级联依赖项: inside main calling package X ____entering package X ____calling package Y ________package Y hello world ____leaving pac

我正在混乱地创建模块并将它们链接起来

当测试行为时,我调用调用其他包的包

有没有一种简单的方法可以通过未来调用的缩进级别来修改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函数周围编写一个小包装器,以便它们接受一个额外的缩进级别参数

package main

import "fmt"

// Println  replacement
func Println(level int, args ...interface{}) {
    for i := level; i > 0; i-- {
        fmt.Print("__")
    }
    fmt.Println(args...)
}

func main() {
    Println(0, "here")
    Println(1, "there")
    Println(2, "everywhere")
    Println(2, "Yes, everywhere")
}
该软件包不支持此开箱即用

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

“概念证明” 访问调用深度如下(对于
main()
,返回
0
;对于从
main()
等调用的函数,返回
1
):

使用它,自动压头打印功能:

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()")
}
哪些输出(在上尝试):

笔记
我称上述解决方案为“概念证明”,因为它不是一个处理所有案例的解决方案。当新的goroutine启动时,您必须决定如何处理。启动新的goroutine时,不会从
main()
调用它们,因此传递到
runtime.Callers()
的跳过帧应小于1(
runtime.Callers(5,pc)
,而不是
runtime.Callers(6,pc)
)。有关如何检测此问题,请参阅。

这不是
fmt
软件包功能的一部分。“是否可以增加…”否。Go不允许您增加内容。你能做的最好的事情就是把东西包起来。
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()")
}
In main()
    In f1()
        In f2()
    In f1() again
In main() again