为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
富国沪深 2023-06-01 18:01:44
考虑以下代码。第一个函数是 MessageStr 类型的接收器方法。为什么fmt.Println(msgstr)执行第一个方法而不调用方法 as fmt.Println(msgstr.String())。还有为什么fmt.Println(msgint32)不执行第二种方法。package mainimport (    "fmt")type MessageStr stringtype MessageInt32 int32func (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())}
查看完整描述

1 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

当您调用 时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)

}

会打印出来:

Joe<39>

Person因为我们自定义了将对象转换为字符串的方式。更多细节:

  • Go 之旅中的接口

  • Go 之旅中的 Stringer


如果您对包中实际发生这种情况的机制感兴趣fmt,请查看.handleMethodssrc/fmt/print.go


查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信