解决一个问题(接上一篇博客)

  解决了前两天在实验楼做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编辑  收藏  举报

导航