You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言fmt包中%q与%#q字符串格式化符的区别是什么

Go fmt 中 %#q 格式化标记的含义

# 是 fmt 包定义的「备用格式」修饰符,和字符串格式化动词 q 搭配时,规则非常明确:

  • 不带修饰符的 %q:固定使用 Go 双引号字符串语法包裹输出内容,所有不符合双引号字符串语法的特殊字符(比如双引号、换行、反斜杠等)都会做转义处理,保证输出内容是一个合法的Go双引号字符串字面量。
  • 带 # 修饰符的 %#q:优先使用 Go 反引号原始字符串语法包裹输出内容,只要待格式化的字符串满足两个条件:不包含反引号字符、不包含换行/回车等不可打印控制字符,就直接输出反引号包裹的原始内容,不需要做任何转义,可读性更强。
  • 如果待格式化的字符串里包含反引号,或者存在换行这类无法在反引号原始字符串中直接表示的控制字符,%#q 会自动回退到和 %q 完全一致的逻辑:用双引号包裹、对特殊字符做转义,保证输出是合法的Go字符串字面量。

测试用例对应解释

你运行的双引号测试代码:

fmt.Printf("%q", "\"")
fmt.Println()
fmt.Printf("%#q", "\"")

输出结果:

"\""
`"`

原因是待格式化的内容只有一个双引号,既没有反引号也没有控制字符,符合反引号包裹的条件,所以%#q直接输出反引号包裹的内容,反引号内部的双引号不需要转义,比带转义的双引号写法更简洁。

再看换行符的测试代码:

fmt.Printf("%q", "\n")
fmt.Println()
fmt.Printf("%#q", "\n")

两个写法输出完全一致,都是"\n":因为换行是控制字符,无法直接放在反引号包裹的原始字符串中(反引号内的换行只会被识别为实际换行,无法表示转义序列\n),所以%#q自动回退到双引号转义的逻辑,和普通%q输出没有区别。

其他常见测试场景的逻辑也完全符合上述规则:

  • 空字符串:%q输出"",%#q输出``
  • 内容为单个反引号的字符串:因为本身包含反引号,无法用反引号包裹,所以%q和%#q输出完全一致,都是双引号拼接的合法字面量
  • 内容为字面量\n(即反斜杠和n两个普通字符,不是换行控制符):%q输出"\\n"(双引号内需要转义反斜杠),%#q输出`\n`(反引号内不需要转义反斜杠,直接输出)
  • 普通纯文本字符串比如abc:%q输出"abc",%#q输出`abc`

内容的提问来源于stack exchange,提问作者Hunam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 18:15:51