我最近在学习Go。这是关于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)
本教程使用%s
编码为第3行,但使用%S
则给出了以下奇怪的结果:ptr type: *string
address: 0xc000010200
value type: string
value: %!S(string=Malibu Point 10880, 90265)
value: Malibu Point 10880, 90265
%s
应该是此指针的字符串值,但是%S
是什么意思?
最佳答案
%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)
此行为来自 badVerb
,即called when you give a bad fmt verb。它记录在 fmt
docs的“格式错误”中。格式错误:
如果为动词给出了无效的参数,例如为%d提供了一个字符串,则生成的字符串将包含问题的描述,如以下示例所示:
类型错误或动词未知:%!动词(类型=值)
关于pointers - %s和%S之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62736371/