在https://tour.golang.org/methods/11
状态表示,可以将接口值视为值和具体类型的元组
我将M定义如下
脚本1
package main
import (
"fmt"
)
type I interface {
M() string
}
type T struct {
S string
w string
}
func (t T) M() string {
return "dddd"
}
func main() {
var i I
i = T{"Hello","eeee"}
fmt.Printf("(%v, %T)", i, i)
fmt.Println(i)
}
这将打印出({Hello eee}, main.T){Hello eee}
界面我有有效的{Hello eee}并键入main.T
脚本2:
package main
import (
"fmt"
)
type I interface {
M() string
}
type T struct {
S string
w string
}
func (t T) M() string {
return "dddd"
}
func (t T) String() string {
return "ccccc"
}
func main() {
var i I
i = T{"Hello","eeee"}
fmt.Printf("(%v, %T)", i, i)
fmt.Println(i)
}
这将打印出(ccccc, main.T)ccccc
。
接口我有有效的ccccc并键入main.T
当我将String()作为由script2中的fmt包定义的Stringer添加时,似乎出现了。 String()是隐式实现的,不确定为什么吗?
我认为在script2中,我将具有“ {Hello eee}”值,并键入main.T
答案 0 :(得分:0)
您应该致电fmt.Println(i.M())
吗?
为什么要fmt
调用一个不存在的函数?
Stringer
是一种可以将自己描述为字符串的类型。 fmt
程序包(以及许多其他程序包)正在寻找此界面来打印值
答案 1 :(得分:0)
引用:https://golang.org/pkg/fmt/#Stringer
Stringer由具有String方法的任何值实现, 定义该值的“本机”格式。使用String方法 打印作为操作数传递的值,使其接受任何格式 字符串或未格式化的打印机(例如“打印”)。
在您的情况下,在script1中,您只是打印出该结构。在script2中,您提供了生成无格式打印时构建器应该使用的功能,该功能可以打印出“ ccccc”。