```go
package main
import (
"fmt"
)
type jiekou interface {
fangfa()string
}
type leixing struct {
a string
}
func (e *leixing) fangfa() string {
e.a="222"
return e.a
}
func run() jiekou {
return &leixing{
"111",
}
}
func main() {
fmt.Println(run())
}
```
请问输出结果为什么不是
222
而是
111
**********************************************
我是模仿下面这个程序写的,
```go
package main
import (
"fmt"
"time"
)
type MyError struct {
When time.Time
What string
}
func (e *MyError) Error() string {
return fmt.Sprintf("at %v, %s",
e.When, e.What)
}
func run() error {
return &MyError{
time.Now(),
"it didn't work",
}
}
func main() {
if err := run(); err != nil {
fmt.Println(err)
}
}
```
你可以debug一下你模仿的那个程序,观察fmt.Println的执行流程。其内部会进行类型断言,判断出这是一个error类型的变量,然后就会调用其Error()方法来输出。因此,只要把fangfa()改成Error()就能输出222。同理,如果你传入的这个变量实现的是String()方法,fmt.Println就会判断这是一个实现了Stringer接口的类型,然后调用其String()方法来输出。
#3
更多评论