In https://tour.golang.org/methods/11
В нем говорится, что под интерфейсом значения интерфейса могут рассматриваться как кортеж значения и конкретного типа
Я определяю M следующим образом
script1
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}
интерфейс, который у меня есть vaule {Hello eee}, и введите main.T
script2:
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
.
интерфейс, у меня есть vaule ccccc и тип main.T
Кажется, когда я добавляю String () как Stringer, определенный какпакет fmt в script2.String () реализован неявно, не уверен почему?
Я думал, что в script2 у меня будет значение "{Hello eee}" и тип main.T