Go 支持在结构体类型中定义方法 (methods)
package main import "fmt" type rect struct { width, height int } // 这里的 `area` 方法有一个_接收器(receiver)类型_ `rect`。 func (r *rect) area() int { return r.width * r.height } // 可以为值类型或者指针类型的接收器定义方法。这里是一个 // 值类型接收器的例子。 func (r rect) perim() int { return 2*r.width + 2*r.height } func main() { r := rect{ 10, height: 5} // 这里我们调用上面为结构体定义的两个方法。 fmt.Println("area: ", r.area()) fmt.Println("perim:", r.perim()) // Go 自动处理方法调用时的值和指针之间的转化。你可以使 // 用指针来调用方法来避免在方法调用时产生一个拷贝,或者 // 让方法能够改变接受的结构体。 rp := &r fmt.Println("area: ", rp.area()) fmt.Println("perim:", rp.perim()) }
接口 (Interfaces) 是命名了的方法签名 (signatures) 的集合。
package main import "fmt" import "math" // 这里是一个几何体的基本接口。 type geometry interface { area() float64 perim() float64 } // 在我们的例子中,我们将在类型 `rect` 和 `circle` 上实现 // 这个接口 type rect struct { width, height float64 } type circle struct { radius float64 } // 要在 Go 中实现一个接口,我们就需要实现接口中的所有 // 方法。这里我们在 `rect` 上实现了 `geometry` 接口。 func (r rect) area() float64 { return r.width * r.height } func (r rect) perim() float64 { return 2*r.width + 2*r.height } // `circle` 的实现。 func (c circle) area() float64 { return math.Pi * c.radius * c.radius } func (c circle) perim() float64 { return 2 * math.Pi * c.radius } // 如果一个变量具有接口类型,那么我们可以调用指定接口中的 // 方法。这里有一个通用的 `measure` 函数,利用它来在任 // 何的 `geometry` 上工作。 func measure(g geometry) { fmt.Println(g) fmt.Println(g.area()) fmt.Println(g.perim()) } func main() { r := rect{ 3, height: 4} c := circle{radius: 5} // 结构体类型 `circle` 和 `rect` 都实现了 `geometry` // 接口,所以我们可以使用它们的实例作为 `measure` 的参数。 measure(r) measure(c) }