解決一個問題(接上一篇博客)

  解決了前兩天在實驗樓作go錯誤處理實驗發現的問題,剛開始覺得跟接口有關,還爲此把這個問題寫到實驗樓講義、博客、後面又在segmentfault提問,覺得解決了,而後昨天寫了段代碼驗證一下結果出現了問題。segmentfault

  這是以前的疑問: f2(42)返回一個&argError類型的值,可是,這個Error()方法是何時調用的?由於最後輸出的是一個字符串。指針

  這是segmentfault的回答:f2 的第一個 return 的返回值有兩個。其中第二值是一個指針,指向的是類(叫結構體也能夠) argError 的一個實例對象。因爲 argError 類實現了 Error 方法,按照 Golang 的 duck type 原則,這個類是 error 接口的實現。code

  這是如今的理解:對象

  Error()方法的調用跟接口以及接口的實現沒有關係,只是由於 fmt.println默認調用了Error()方法,由於Error方法是error接口內置方法。我後面把代碼改了一下,加了一個方法以後發現不管如 何只實現Error方法,以後又把Error方法名字改掉,就只返回指針而不實現任何方法了。下面貼一段代碼:接口

  package main字符串

  import (博客

"fmt"

  )it

  type Areaer interface {class

Area() float64

  }import

  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}

  因而可知,雖然也是返回了指針類型,可是沒有調用對象的方法。(實驗樓代碼參見上一篇博客)

相關文章
相關標籤/搜索