go中“errors”包代码问题

package main

import (
    "fmt"
)

type test interface {
    Error1() string
}

func New(name string) test {
    return &student{name}
}

type student struct {
    name string
}

func (s *student) Error1() string {
    fmt.Println("只有当把Error1改成Error时,这行才会打印") // 第21行
    return s.name
}

func main() {
    s := New("mike")
    fmt.Println("s = ", s)
    // fmt.Println("s = ", s.Error1()) // 如果不是Error需要手动调用
}

学习error包时,经过我测试发现只有把代码中两处Error1改成单词Error时,第21行才会执行打印,其他任何单词都不行。这是为什么呢,go是怎么做的

已邀请:

tt_0411 - Less is better.

赞同来自: 不右

func Error() string 是 error interface的方法; fmt.Println 会判断形参的类型, 如果是 error 类型 (即实现了 Error() string 方法), 则调用 Error() 方法.

alphayan

赞同来自: 不右

这个是fmt.Println()函数的功能, 你的test接口其实都没有什么用, 还可以这么玩:

func New(name string) *student {
    return &student{name}
}

type student struct {
    name string
}

func (s *student) String() string {
    fmt.Println("只有当把Error1改成Error时,这行才会打印") // 第21行
    return s.name
}
func main() {
    s := New("mike")
    fmt.Println("s = ", s)
}

delveshal

赞同来自:

需要实现Error接口

要回复问题请先登录注册