在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