为什么Go语言中的fmt.Println打印%s字面量而不是值?

3

请考虑,

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?

我尝试从文档中找到答案,

如果格式(对于Println等隐式为%v)适用于字符串(%s %q %v %x %X),则遵循以下两个规则:

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

  2. 如果操作数实现了String() string方法,则调用该方法将对象转换为字符串,然后根据所需的动词(如果有)进行格式化。

但我不确定这是否会影响我的程序。


1
因为你调用的是Println,而不是Printf。 - undefined
2
Println根本不进行格式化。 - undefined
1
请看一下您链接的Println文档,这里没有格式字符串参数。 - undefined
@JimB 谢谢。我现在明白了。我猜我还没有花足够的时间学习像Go这样的语言。 - undefined
1
总的来说,你会发现字符串处理的特性/范式更像是C#或Java而不是PHP或Python,大部分的事情都会为你处理好,但你仍然需要明确表达。 - undefined
2个回答

4

Printf 中的 f 代表 "格式化"。这就是为什么 %? 动词会起作用的原因,因为该函数被构建用于解析它们。而 Println 则没有这样的格式化功能。

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


1
Println只是打印字符串并在其后附加一个换行符。Printf是'print format'的简写形式,基于C库,格式说明符等约定就来源于此。

简单来说,这是设计上的,如果要使用格式说明符,您必须调用格式化方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接