Go語言中如何正確封裝log.Printf并傳遞參數?

Go語言中如何正確封裝log.Printf并傳遞參數?

go語言日志輸出的自定義封裝及參數傳遞詳解

在Go語言開發中,經常需要自定義日志輸出,例如控制日志級別或格式。本文將詳細解釋如何正確封裝log.Printf函數并傳遞參數,解決參數傳遞錯誤的問題。

問題:開發者嘗試封裝log.printf,但自定義函數的輸出結果與預期不符,出現類似“[jim %!s(int=18)],今年%!d(missing)”的錯誤信息。原始代碼如下:

package main  import "log"  func main() {     debugf("我叫%s,今年%d", "jim", 18) }  func debugf(str string, arg ...Interface{}) {     if true {         log.Printf(str+"n", arg) // 錯誤:參數傳遞方式錯誤     } }

原因:log.Printf期望接收一個格式化字符串和多個interface{}類型的參數,這些參數用于替換格式化字符串中的占位符。原始代碼將整個arg切片作為單個參數傳遞給log.Printf,而不是將切片元素逐個傳遞,導致log.Printf無法正確解析占位符。

立即學習go語言免費學習筆記(深入)”;

解決方案:需要將arg切片展開,將每個元素作為獨立參數傳遞給log.Printf。修改后的debugf函數如下:

func Debugf(str string, arg ...interface{}) {     if true {         log.Printf(str+"n", arg...) // 正確:使用 ... 展開參數     } }

通過在arg后添加…,我們將arg切片中的元素展開,作為獨立參數傳遞給log.Printf。這樣,log.Printf就能正確解析和替換占位符,輸出正確的日志信息,例如:“2024-10-27 10:30:00 我叫jim,今年18”(時間戳可能略有不同)。 這強調了正確展開參數對于log.Printf正確使用的重要性。

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享