首页 > 解决方案 > %s 和 %S 之间的差异

问题描述

我最近在学习围棋。这是关于 Go 指针的事情。

这是代码:

var house = "Malibu Point 10880, 90265"
ptr := &house

fmt.Printf("ptr type: %T \n", ptr)
fmt.Printf("address: %p \n", ptr)

value := *ptr

fmt.Printf("value type: %T \n", value)
fmt.Printf("value: %S\n", value)
fmt.Printf("value: %s\n", value)

本教程被编码为第 3 行,%s%S它给出了这个奇怪的结果:

ptr type: *string
address: 0xc000010200
value type: string
value: %!S(string=Malibu Point 10880, 90265)
value: Malibu Point 10880, 90265

应该是这个%s指针的字符串值,但是是什么%S意思呢?

标签: pointersgo

解决方案


%S不是有效的 fmt 动词。你得到的输出相当于%p. 没什么特别的%S。这似乎发生在任何无法识别的动词上。

fmt.Printf("value: %p\n", value)
fmt.Printf("value: %S\n", value)
fmt.Printf("value: %L\n", value)
fmt.Printf("value: %A\n", value)

value: %!p(string=Malibu Point 10880, 90265)
value: %!S(string=Malibu Point 10880, 90265)
value: %!L(string=Malibu Point 10880, 90265)
value: %!A(string=Malibu Point 10880, 90265)

当您给出错误的 fmt 动词时badVerb,会调用此行为。它记录在docs的“格式错误”中。fmt

格式错误:

如果为动词提供了无效参数,例如向 %d 提供字符串,则生成的字符串将包含问题描述,如以下示例所示:

错误类型或未知动词:%!verb(type=value)


推荐阅读