解决了前两天在实验楼做go错误处理实验发现的问题,刚开始以为跟接口有关,还为此把这个问题写到实验楼讲义、博客、后面又在segmentfault提问,以为解决了,然后昨天写了段代码验证一下结果出现了问题。
这是之前的疑问: f2(42)返回一个&argError类型的值,但是,这个Error()方法是什么时候调用的?因为最后输出的是一个字符串。
这是segmentfault的回答:f2 的第一个 return 的返回值有两个。其中第二值是一个指针,指向的是类(叫结构体也可以) argError 的一个实例对象。由于 argError 类实现了 Error 方法,按照 Golang 的 duck type 原则,这个类是 error 接口的实现。
这是现在的理解:
Error()方法的调用跟接口以及接口的实现没有关系,只是因为 fmt.println默认调用了Error()方法,因为Error方法是error接口内置方法。我后面把代码改了一下,加了一个方法之后发现无论如 何只实现Error方法,之后又把Error方法名字改掉,就只返回指针而不实现任何方法了。下面贴一段代码:
package main
import (
"fmt"
)
type Areaer interface {
Area() float64
}
type Rect struct {
width, height float64
func (r *Rect) Area() float64 {
return r.width * r.height
func NewRect(width, height float64) Areaer {
return &Rect{width, height}
func main() {
r := &Rect{5, 6} r1 := NewRect(10, 20) fmt.Println(r) fmt.Println(r1)
} 输出:&{5 6}
&{10 20}
由此可见,虽然也是返回了指针类型,但是没有调用对象的方法。(实验楼代码参见上一篇博客)
posted on 2016-05-21 13:51 Ellon_Daris 阅读(244) 评论(0) 编辑 收藏 举报
Powered by: 博客园 Copyright © 2024 Ellon_Daris Powered by .NET 8.0 on Kubernetes
解决了前两天在实验楼做go错误处理实验发现的问题,刚开始以为跟接口有关,还为此把这个问题写到实验楼讲义、博客、后面又在segmentfault提问,以为解决了,然后昨天写了段代码验证一下结果出现了问题。
这是之前的疑问: f2(42)返回一个&argError类型的值,但是,这个Error()方法是什么时候调用的?因为最后输出的是一个字符串。
这是segmentfault的回答:f2 的第一个 return 的返回值有两个。其中第二值是一个指针,指向的是类(叫结构体也可以) argError 的一个实例对象。由于 argError 类实现了 Error 方法,按照 Golang 的 duck type 原则,这个类是 error 接口的实现。
这是现在的理解:
Error()方法的调用跟接口以及接口的实现没有关系,只是因为 fmt.println默认调用了Error()方法,因为Error方法是error接口内置方法。我后面把代码改了一下,加了一个方法之后发现无论如 何只实现Error方法,之后又把Error方法名字改掉,就只返回指针而不实现任何方法了。下面贴一段代码:
package main
import (
)
type Areaer interface {
}
type Rect struct {
}
func (r *Rect) Area() float64 {
}
func NewRect(width, height float64) Areaer {
}
func main() {
}
输出:&{5 6}
由此可见,虽然也是返回了指针类型,但是没有调用对象的方法。(实验楼代码参见上一篇博客)