是否可以使用默认缩进级别增加 fmt.print?
Is it possible to augment fmt.print with default indentation level?
我正在忙于创建模块并将它们相互链接起来。
测试行为时,我正在调用调用其他包的包。
是否有一种简单的方法来修改 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")
}
fmt
包不支持开箱即用。
但是,您可以借助 runtime.Callers()
访问调用深度,这意味着您甚至不必手动维护缩进“级别”。
“概念验证”
访问调用深度是这样的(returns 0
用于 main()
,1
用于从 main()
调用的函数等):
func callDepth() int {
pc := make([]uintptr, 100)
return runtime.Callers(6, pc)
}
并使用它,auto-indenter 打印功能:
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)
)。有关如何检测这一点,请参阅 。
我正在忙于创建模块并将它们相互链接起来。
测试行为时,我正在调用调用其他包的包。
是否有一种简单的方法来修改 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")
}
fmt
包不支持开箱即用。
但是,您可以借助 runtime.Callers()
访问调用深度,这意味着您甚至不必手动维护缩进“级别”。
“概念验证”
访问调用深度是这样的(returns 0
用于 main()
,1
用于从 main()
调用的函数等):
func callDepth() int {
pc := make([]uintptr, 100)
return runtime.Callers(6, pc)
}
并使用它,auto-indenter 打印功能:
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)
)。有关如何检测这一点,请参阅