面试题答案
一键面试runtime.Stack
函数:- 用途:可以获取当前goroutine的栈跟踪信息。它将栈信息写入到一个字节切片中,常用于调试时查看当前goroutine的执行状态,比如函数调用栈的层级结构,便于定位程序在何处出现死锁、阻塞等问题。例如:
其中第二个参数var buf [4096]byte n := runtime.Stack(buf[:], false) fmt.Printf("当前goroutine栈信息:\n%s", buf[:n])
false
表示不获取所有goroutine的栈信息,只获取当前goroutine的栈信息。如果为true
,则获取所有goroutine的栈信息。runtime.Caller
函数:- 用途:用于获取当前goroutine调用栈中指定深度的函数调用信息,包括函数所在的文件名、行号以及函数名等。可以通过多次调用
runtime.Caller
并递增深度值,从而逐步获取调用栈的各级信息,有助于分析函数调用链路,理解程序的执行流程。例如:
这里深度值为_, file, line, _ := runtime.Caller(1) fmt.Printf("当前函数在文件 %s 的第 %d 行被调用\n", file, line)
1
表示获取调用当前函数的外层函数信息,深度值为0
获取的是runtime.Caller
自身调用处的信息,一般使用1
及以上来获取实际业务代码调用信息。- 用途:用于获取当前goroutine调用栈中指定深度的函数调用信息,包括函数所在的文件名、行号以及函数名等。可以通过多次调用
runtime.GoroutineProfile
函数:- 用途:收集当前运行的goroutine的概要信息,这些信息可以用于分析goroutine的创建、销毁以及生命周期等情况。通过
runtime.GoroutineProfile
收集的信息可以进一步通过pprof
工具进行可视化展示和深入分析,有助于全面了解程序中goroutine的行为模式,发现潜在的性能问题或资源管理不当的地方。例如:
收集的信息存储在var buf bytes.Buffer if err := runtime.GoroutineProfile(&buf); err != nil { log.Fatal(err) }
buf
中,后续可以通过pprof
相关接口进一步处理。- 用途:收集当前运行的goroutine的概要信息,这些信息可以用于分析goroutine的创建、销毁以及生命周期等情况。通过