在Go语言中,接口(interface)是一种类型,它规定了一组方法签名,但它不会实现这些方法。接口类型的变量可以保存任何实现了这些方法的值。接口的定义以关键字interface
开始,后跟接口名称和一组方法声明。方法声明包括方法名、参数列表和返回值列表。方法名在接口中必须唯一。
以下是一个简单的Go语言接口定义示例:
package main
import "fmt"
// 定义一个名为Shape的接口,包含两个方法:Area和Perimeter
type Shape interface {
Area() float64
Perimeter() float64
}
// 定义一个名为Circle的结构体,表示一个圆形
type Circle struct {
Radius float64
}
// 为Circle结构体实现Shape接口的Area方法
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
// 为Circle结构体实现Shape接口的Perimeter方法
func (c Circle) Perimeter() float64 {
return 2 * 3.14 * c.Radius
}
// 定义一个名为Rectangle的结构体,表示一个矩形
type Rectangle struct {
Width, Height float64
}
// 为Rectangle结构体实现Shape接口的Area方法
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
// 为Rectangle结构体实现Shape接口的Perimeter方法
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}
// 定义一个名为PrintAreaAndPerimeter的函数,接受一个Shape接口类型的参数
func PrintAreaAndPerimeter(s Shape) {
fmt.Printf("Area: %v\n", s.Area())
fmt.Printf("Perimeter: %v\n", s.Perimeter())
}
func main() {
c := Circle{Radius: 5}
r := Rectangle{Width: 3, Height: 4}
// 由于Circle和Rectangle都实现了Shape接口,它们都可以传递给PrintAreaAndPerimeter函数
PrintAreaAndPerimeter(c)
PrintAreaAndPerimeter(r)
}
在这个示例中,我们定义了一个名为Shape
的接口,包含两个方法:Area()
和Perimeter()
。然后,我们定义了两个结构体:Circle
和Rectangle
,并为它们分别实现了Shape
接口的方法。最后,我们定义了一个名为PrintAreaAndPerimeter
的函数,该函数接受一个Shape
接口类型的参数,并打印出输入形状的面积和周长。在main
函数中,我们创建了一个圆形和一个矩形的实例,并将它们传递给PrintAreaAndPerimeter
函数。