Go中格式化输出代码结果乱码

在 Go 中封装 fmt.Printf 代码的时候,总是会出现以下问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

import "log"

func main() {
Debugf("我叫%s,今年%d", "jim", 18)
}

func Debugf(str string, arg ...interface{}) {
if true {
log.Printf(str+"\n", arg)
}
}

// 期望输出
2021/12/17 16:35:16 我叫jim,今年18

// 实际输出
2021/12/17 16:35:16 我叫[jim %!s(int=18)],今年%!d(MISSING)

在实际输出中,并不能正确的格式化输出。

在经过调试后发现了问题:

1
log.Printf(str+"\n", arg)

log.Printf 方法要求传入的是一个格式化字符串以及一个可变参数 v,在上面的代码中,我们把 arg 作为一个切片(作为一个可变参数中的一个元素)传进去了,而并不是把 arg 里的所有元素转变为可变参数传进去,所以出现了这个问题。

将上面代码修改为:

1
log.Printf(str+"\n", arg...)

至此问题解决。


Go中格式化输出代码结果乱码
https://sunshinechen.cn/2023/09/01/Go中格式化输出代码结果乱码/
作者
sunshine
发布于
2023年9月1日
许可协议