【问题标题】:Why does fmt.Println in Go print the verb %s literal instead of the value?为什么 Go 中的 fmt.Println 打印动词 %s 文字而不是值?
【发布时间】:2015-11-07 02:44:14
【问题描述】:

考虑一下,

package main
import "fmt"

func main() {
  name := "johnny"
  fmt.Println("Hello world %s\n", name)
}

打印出来,

你好世界%s 约翰尼


为什么我得到的是 %s 而不是这个,

package main
import "fmt"

func main() {
  name := "johnny"
  fmt.Printf("Hello world %s\n", name)
}

哪个打印 Hello world johnny?

我试图从documentation 中找出答案,

如果格式(对于 Println 等隐含 %v)对 string (%s %q %v %x %X),以下两条规则适用:

  1. 如果操作数实现了错误接口,则会调用 Error 方法将对象转换为字符串,然后将 按照动词的要求进行格式化(如果有的话)。

  2. 如果操作数实现方法 String() 字符串,将调用该方法将对象转换为字符串,然后将 按照动词的要求进行格式化(如果有的话)。

但我无法理解这是否会影响我的程序。

【问题讨论】:

  • 因为你调用的是 Println,而不是 Printf。
  • Println 根本不进行格式化。
  • 还请查看您链接的 Println 文档,没有格式字符串参数。
  • @JimB 谢谢。我现在看到了。我想我在 Go 之类的语言上花的时间不够。
  • 一般来说,你会发现字符串处理特性/范式更像 C# 或 Java 而不是 PHP 或 Python,大多数东西都为你处理好了,但你仍然必须明确。

标签: go


【解决方案1】:

Printf 中的 f 用于“格式化”。这就是为什么%? 动词可以做任何事情的原因,因为该函数是为解析它们而构建的。 Println 没有这种格式。

格式化不是某些语言中字符串的属性(也许你和我一样来自 Python?)

【讨论】:

    【解决方案2】:

    Println 只是打印字符串并在其上附加一个换行符。 Printf 是“打印格式”的缩写,它基于 C 库,这是格式说明符等约定的来源。

    简单的答案是它的设计。如果你想使用格式说明符,你必须调用 format 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-20
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      相关资源
      最近更新 更多