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

考虑以下代码。第一个函数是 MessageStr 类型的接收器方法。为什么fmt.Println(msgstr)执行第一个方法而不调用方法 as 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())


}


富国沪深
浏览 129回答 1
1回答

猛跑小猪

当您调用 时fmt.Println,它需要一个实现该Stringer接口的对象。它记录如下:如果操作数实现方法 String() string,将调用该方法将对象转换为字符串,然后根据动词(如果有)的要求进行格式化该fmt包还声明了Stringer接口:type Stringer interface {    String() string}这样的对象必须有一个String()不接受任何参数并返回一个string. fmt.Println然后调用该String方法。这让我们可以为自定义类型定义它们将如何打印出来。例如:package mainimport "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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go