Go 为什么调用此String()方法时不按名称调用它
考虑以下代码。第一个函数是MessageStr类型的接收方方法。为什么Go 为什么调用此String()方法时不按名称调用它,go,Go,考虑以下代码。第一个函数是MessageStr类型的接收方方法。为什么fmt.Println(msgstr)执行第一个方法而不调用fmt.Println(msgstr.String())。还有为什么fmt.Println(msgint32)不执行第二个方法 package main import ( "fmt" ) type MessageStr string type MessageInt32 int32 func (msgs MessageStr) String() strin
fmt.Println(msgstr)
执行第一个方法而不调用fmt.Println(msgstr.String())
。还有为什么fmt.Println(msgint32)
不执行第二个方法
package main
import (
"fmt"
)
type MessageStr string
type MessageInt32 int32
func (msgs MessageStr) String() string {
return string("<<" + msgs + ">>")
}
func (msgi MessageInt32) Int32() int32 {
return int32(msgi * 2)
}
func main() {
msgstr := MessageStr("Mastering Go")
// why this outputs <<Mastering Go>>
// without calling the String() method
fmt.Println(msgstr)
msgint32 := MessageInt32(11)
// why this doesn't output 11*2 = 22
fmt.Println(msgint32)
fmt.Println(msgint32.Int32())
}
主程序包
进口(
“fmt”
)
输入MessageStr字符串
输入MessageInt32 int32
func(msgs MessageStr)String()字符串{
返回字符串(“”)
}
func(msgi MessageInt32)Int32()Int32{
返回int32(msgi*2)
}
func main(){
msgstr:=MessageStr(“掌握Go”)
//这是为什么
//不调用String()方法
fmt.Println(msgstr)
msgint32:=MessageInt32(11)
//为什么不输出11*2=22
格式打印LN(msgint32)
fmt.Println(msgint32.Int32())
}
调用fmt.Println
时,它需要一个实现Stringer
接口的对象。内容如下:
如果操作数实现方法String()String,则该方法将
调用以将对象转换为字符串,然后
按动词要求格式化(如有)
fmt
包还声明了Stringer
接口:
type Stringer interface {
String() string
}
此类对象必须有一个String()
方法,该方法不接受任何参数并返回String
fmt.Println
然后调用String
方法。这让我们可以为自定义类型定义如何打印它们。例如:
package main
import "fmt"
type Person struct {
name string
age int
}
func (p Person) String() string {
return fmt.Sprintf("%s<%d>", p.name, p.age)
}
func main() {
p := Person{name: "Joe", age: 39}
fmt.Println(p)
}
主程序包
输入“fmt”
类型Person结构{
名称字符串
年龄智力
}
func(p Person)String()字符串{
返回fmt.Sprintf(“%s”,p.name,p.age)
}
func main(){
p:=人{姓名:“乔”,年龄:39}
fmt.Println(p)
}
将打印:
Joe<39>
乔
因为我们已经定制了Person
对象转换为字符串的方式。更多详情:
如果您对
fmt
包中实际发生的机制感兴趣,请查看src/fmt/print.go
中的handleMethods
方法。。。它有点被其他打印规则所掩盖,但您可以使用您最喜欢的浏览器在页面中搜索String()
,以查找相关文本。@user815693对于第一种情况,它实际上是在调用String()方法,因为它打印了>。你为什么说没有?对于第二种情况,fmt函数没有处理标准的“Int32()”接口。@mgagnon,因为在第一种情况下,我不理解fmt.Println(msgstr)
如何调用String()
。