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

标签 go gofmt

我正在搞乱创建模块并将它们互连。
在测试行为时,我正在调用调用其他包的包。
是否有一种简单的方法可以通过 future 调用的缩进级别来修改 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 用于 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) )。检测方法见 Check if function is being called as goroutine or not .

关于go - 是否可以使用默认缩进级别来增加 fmt.print?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63902449/

相关文章:

go - 向 TCP 服务器发送多个请求失败

go - 微服务中提取载体未找到SpanContext

go - 如何拆分 fmt.sprintf 的长行

go - 如何使用重写规则在 gofmt 工具中用空格替换制表符?

go - 我如何在 Golang 中获取用户的输入 (fmt.scan)

unit-testing - 如何在 go 中实现 CLI 命令的单元测试

go - Go lang生成定长随机数

mongodb - Golang revel+mgo - 当结构变量具有小写名称时不返回数据

go - fmt.Printf ("%f\n",x) 将 Float64 舍入为 Float32,但 fmt.Println(x) 不会

go - Go代码格式不一致?