Go 为什么调用此String()方法时不按名称调用它

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

考虑以下代码。第一个函数是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() 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()