在Golang中,接口(interface)是一种类型,它定义了一些方法,但不包含这些方法的具体实现。任何类型,只要它实现了接口所有的方法,都可以被看作是这个接口的类型。这种动态类型系统允许在运行时更改类型。
以下是一个简单的例子,演示了如何在Golang中使用接口和动态类型:
package main
import (
"fmt"
)
// 定义一个接口
type Shape interface {
Area() float32
}
// 定义一个实现了Shape接口的结构体
type Rectangle struct {
width, height float32
}
// 为Rectangle结构体实现Area方法
func (r Rectangle) Area() float32 {
return r.width * r.height
}
func main() {
// 创建一个Rectangle结构体实例
r := Rectangle{width: 10, height: 20}
// 将接口变量a赋值为r
var a Shape = r
// 输出面积
fmt.Printf("面积: %f\n", a.Area())
// 在运行时改变类型
c := Circle{radius: 15}
a = c
// 输出面积
fmt.Printf("面积: %f\n", a.Area())
}
// 定义另一个实现了Shape接口的结构体
type Circle struct {
radius float32
}
// 为Circle结构体实现Area方法
func (c Circle) Area() float32 {
return 3.14 * c.radius * c.radius
}
在这个例子中,我们定义了一个Shape
接口和两个实现了该接口的结构体Rectangle
和Circle
。我们可以看到,一个接口变量a
可以在运行时持有不同类型的实例,只要这些实例实现了Shape
接口所要求的Area()
方法。这就是Golang中接口与动态类型的一个基本示例。