關於介面實現的一個小問題

gameogre發表於2016-10-21
type geometry interface {
    area() float64
    perim() float64
}

type rect struct {
    width, height float64
}
type circle struct {
    radius float64
}

func (r rect) area() float64 {
    return r.width * r.height
}
func (r rect) perim() float64 {
    return 2*r.width + 2*r.height
}

func (c *circle) area() float64 {
    return math.Pi * c.radius * c.radius
}
func (c *circle) perim() float64 {
    return 2 * math.Pi * c.radius
}
func measure(g geometry) {
    fmt.Println(g)
    fmt.Println(g.area())
    fmt.Println(g.perim())
}

r := rect{3, 4}
c := circle{5}
measure(r)
measure(&c) //如果這樣寫 measure(c)就不行,也就是說c沒有實現相應的介面,報錯。必須 傳地址進去,意思是&c 實現了介面。
看下面程式碼:
var cc circle= circle{6}
    var ccptr *circle= &cc
    fmt.Println(cc.area())
    fmt.Println(ccptr.area())
    fmt.Println(cc)

既然編譯器可以聰明的在適當的時候進行取地址 和 指標解引用 ,為何在介面這裡就不行了呢?為什麼要區分這麼嚴格呢?

謝謝。

更多原創文章乾貨分享,請關注公眾號
  • 關於介面實現的一個小問題
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章