Golang调试函数



来自shell编程,在那里我使用了很多这样的函数:

log_action() {
case "${1}" in
'ERROR')
EXIT_CODE="${3}"
echo "[${1}] | $(date +"%T") | ${2} | Exiting (${EXIT_CODE})"
exit ${EXIT_CODE};
;;
'WARNING')
echo "[${1}] | $(date +"%T") | ${2} | Line: (${3})"
;;
'DEBUG')
if [[ ${DEBUG} -eq "1" ]]; then {
echo "[${1}] | $(date +"%T") | ${2} | ${3}"
}; fi
;;
*)
echo "[${1}] | $(date +"%T") | ${2} | ${3}"
;;
esac
}

log_action "WARNING" "Cannot Connect to MySQL Database" "${LINENO}")

现在,我开始学习golang,并希望将所有bash脚本转换为go。所以,我需要在golang中使用相同的功能,我尝试了以下功能:

func logHandler(t string, e string, l string) {
switch t {
case "warning":
fmt.Println("WARNING")
case "error":
fmt.Println("ERROR")
case "debug":
fmt.Println("DEBUG |", e, l)
}
}
logHandler("debug", "Test Function", "LineNumber")

但我不知道如何在调用logHandler函数时获得当前的行号变量(linenumber(,并将其作为字符串或int传递给函数。

此外,有没有任何方法可以像bash选项那样在跟踪模式下运行go脚本:set-o xtrace?

我只是一个初学者,所以如果我做错了什么,请给我指正确的方向。非常感谢。

这里有一种优雅的方法。

我们将使用runtime包,方法如下:

package main
import (
"fmt"
"runtime"
)
func main() {
logHandler("warning", "Test Function")
logHandler("error", "Test Function")
logHandler("debug", "Test Function")
}
func logHandler(t, e string) {
switch t {
case "warning":
fmt.Println("WARNING |", e)
case "error":
fmt.Println("ERROR   |", e)
case "debug":
// 0 = This function
// 1 = Function that called this function
_, fn, line, _ := runtime.Caller(1)
fmt.Printf("DEBUG   | %s:%d | %vn", fn, line, e)
}
}

输出:

WARNING | Test Function
ERROR   | Test Function
DEBUG   | /home/runner/main.go:11 | Test Function

工作示例链接


您基本上可以为所有这些(警告和调试(执行此操作

如果您感兴趣,这里有一些关于运行时包的附加阅读。


灵感来自OneOfOne的这一伟大答案

最新更新