Go支持在struct類(lèi)型上定義的方法铛漓。area方法有一個(gè)* rect類(lèi)型的接收器眯停。可以為指針或值接收器類(lèi)型定義方法喷众。這里是一個(gè)值接收器的例子各谚。
這里調(diào)用struct定義的2個(gè)方法。
接口是方法簽名的命名集合侮腹。這里是幾何形狀(geometry)的基本接口。
對(duì)于這個(gè)例子稻励,將在rect和circle類(lèi)型上實(shí)現(xiàn)這個(gè)接口父阻。
要在Go中實(shí)現(xiàn)一個(gè)接口,需要實(shí)現(xiàn)接口中的所有方法望抽。 這里在rect上實(shí)現(xiàn)geometry的一個(gè)實(shí)例加矛。
以及circles的實(shí)現(xiàn)。
如果變量具有接口類(lèi)型煤篙,那么可以調(diào)用命名接口中的方法斟览。這里是一個(gè)通用measure()函數(shù),任何幾何形狀都有這個(gè)函數(shù)辑奈。
circle和rect結(jié)構(gòu)類(lèi)型都實(shí)現(xiàn)了幾何(geometry)接口苛茂,因此可以使用這些結(jié)構(gòu)體的實(shí)例上調(diào)用measure()函數(shù)。
代碼示例:
package main
import (
"fmt"
"math"
)
//定義幾何圖形的基本接口 geometry 幾何
type geometry interface {
area() float64
perim() float64
}
//定義矩形和圓形的結(jié)構(gòu)體
type rect struct {
width, height float64
}
type circle struct {
radius float64
}
//在GO中實(shí)現(xiàn)一個(gè)接口鸠窗,只需要實(shí)現(xiàn)接口中的所有方法
//實(shí)現(xiàn)矩形的接口
//計(jì)算矩形的面積
func (r rect) area() float64 {
return r.width * r.height
}
//計(jì)算矩形的邊長(zhǎng)
func (r rect) perim() float64 {
return r.width*2 + r.height*2
}
//實(shí)現(xiàn)幾何 圓 面積計(jì)算
func (c circle) area() float64 {
//圓周率 乘以 變徑的平方
return math.Pi * c.radius * c.radius
}
//計(jì)算圓的邊長(zhǎng)
func (c circle) perim() float64 {
return 2 * math.Pi * c.radius
}
//如果變量有接口類(lèi)型妓羊,那么我們可以調(diào)用命名接口中的方法。這里有一個(gè)通用的'measure'函數(shù)利用這一點(diǎn)來(lái)處理任何'geometry' 接口實(shí)現(xiàn)稍计。
func measure(g geometry) {
fmt.Println(g)
fmt.Println(g.area())
fmt.Println(g.perim())
}
func main() {
r := rect{width: 3, height: 4}
c := circle{radius: 1}
// The `circle` and `rect` struct types both
// implement the `geometry` interface so we can use
// instances of
// these structs as arguments to `measure`.
measure(r)
measure(c)
}