作为一名初学者,在学习go中总会遇到一些小小的问题,为了强化学习随手将其做个笔记
1、errors包遇到的问题
package main
import (
"fmt"
)
package errors
// New returns an error that formats as the given text.
// Each call to New returns a distinct error value even if the text is identical.
func New(text string) error {
return &errorString{text}
}
// errorString is a trivial implementation of error.
type errorString struct {
s string
}
func (e *errorString) Error() string {
return e.s
}
上述代码是errors包中的代码
func main() {
demo01 := New("这是测试一")
fmt.Println(demo01)
demo01是大部分时候的用法
demo02 := New("这是测试二") ------1
fmt.Println(demo02.Error()) ------2
}
demo02是我觉得最为正常的用法,理由是:
1、第一步在调用New()函数的时候返回一个&errorString{text}实例,注意此处errorString结构体实现了error接口的方法,所以可以互相转换。
2、第二步在调用Error函数时候传进去一个实例,返回一个string,但是实际上两个返回的结果是一样的。
经过查阅资料发现,这是因为类型errorString实现了error接口的Error()方法,而在fmt.Println函数中,如果打印的变量实现了error接口,那么会自动调用该变量的Error()方法进行输出。所以在fmt.Println(a)时,虽然没有显式地调用Error()方法,但在底层仍然会隐式地调用该方法,从而输出与fmt.Println(b.Error())相同的结果。