gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:31:24 26 4
gpt4 key购买 nike

考虑以下代码。第一个函数是 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.Println 时,它需要一个实现 Stringer 接口(interface)的对象。这是documented如下:

If an operand implements method String() string, that method will be invoked to convert the object to a string, which will then be formatted as required by the verb (if any)

fmt 包还声明了 Stringer 接口(interface):

type Stringer interface {
String() string
}

此类对象必须有一个 String() 方法,该方法不接受任何参数并返回一个 stringfmt.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 对象转换为字符串的方式。更多详情:


如果您对 fmt 包中实际发生的机制感兴趣,请查看 src/fmt/中的 handleMethods 方法打印.go.

关于go - 为什么调用此 String() 方法而不按名称调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54307751/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com