来自 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) 并将其作为字符串或整数传递给函数。

另外,有什么方法可以像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 | %v\n", fn, line, e)
    }
}


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

Working example link

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

如果你有兴趣,这里有一些关于 runtime package 的额外阅读。

灵感来自 this great answerOneOfOne

关于debugging - Golang调试功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51389608/

10-16 16:44