Go 系列教程 —— 31. 自定义错误

Noluye · 2018-04-12 22:09:51
summer_ice
摸鱼ing

第二个demo下面glayground

#4
更多评论

func cicleArea(radius float64) (float64, error) {

为什么error是小写的,但是在其他包能够调用到? 还是说接口没有这个限制?


fmt.Println(err) 这个方法怎么知道默认取调用下面函数的?

func (e *errorString) Error() string { return e.s }

而且

(e *errorString) 这个地方为什么要用一个指针?

#1

@baoguoding</a> 小写的error是在 builtin.go 中定义的接口,就和float64一样,可以直接使用的。

builtin.go文件中对error接口的声明如下:

// The error built-in interface type is the conventional interface for
// representing an error condition, with the nil value representing no error.
type error interface {
    Error() string
}

fmt.Println(err) 这个方法怎么知道默认取调用下面函数的?

==> fmt.Println()函数接收任意的接口类型的参数,error是接口类型,所以能够被传入。在Println的内部,会根据传入的值的类型进行处理,对于error类型的值,go会调用 print.go 中的 handleMethods 方法进行处理(在第624行调用了error接口的的Error方法),所以你直接传入err的话会调用Error方法进行输出。

func (e *errorString) Error() string { return e.s } 这个地方使用指针的原因是errorString结构体的Error方法使用的是的指针接收器的方式。

#2