考虑以下代码。第一个函数是 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
,请查看.handleMethods
src/fmt/print.go
- 1 回答
- 0 关注
- 128 浏览
添加回答
举报
0/150
提交
取消