解決了前兩天在實驗樓作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}
因而可知,雖然也是返回了指針類型,可是沒有調用對象的方法。(實驗樓代碼參見上一篇博客)
解決了前兩天在實驗樓作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 (博客
)it
type Areaer interface {class
}import
type Rect struct {
}
func (r *Rect) Area() float64 {
}
func NewRect(width, height float64) Areaer {
}
func main() {
}
輸出:&{5 6}
因而可知,雖然也是返回了指針類型,可是沒有調用對象的方法。(實驗樓代碼參見上一篇博客)