75 lines
1.4 KiB
Markdown
75 lines
1.4 KiB
Markdown
|
|
# 01-interfaces - 接口定义与实现
|
||
|
|
|
||
|
|
## 知识点讲解
|
||
|
|
|
||
|
|
### 接口定义
|
||
|
|
|
||
|
|
```go
|
||
|
|
type Shape interface {
|
||
|
|
Area() float64
|
||
|
|
Perimeter() float64
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 接口实现
|
||
|
|
|
||
|
|
```go
|
||
|
|
type Rectangle struct {
|
||
|
|
Width float64
|
||
|
|
Height float64
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r Rectangle) Area() float64 {
|
||
|
|
return r.Width * r.Height
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r Rectangle) Perimeter() float64 {
|
||
|
|
return 2 * (r.Width + r.Height)
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**注意**:Go中接口是隐式实现的,不需要显式声明
|
||
|
|
|
||
|
|
### 多态
|
||
|
|
|
||
|
|
```go
|
||
|
|
func printShapeInfo(s Shape) {
|
||
|
|
fmt.Printf("面积: %.2f\n", s.Area())
|
||
|
|
fmt.Printf("周长: %.2f\n", s.Perimeter())
|
||
|
|
}
|
||
|
|
|
||
|
|
rect := Rectangle{Width: 10, Height: 5}
|
||
|
|
circle := Circle{Radius: 7}
|
||
|
|
|
||
|
|
printShapeInfo(rect) // 可以传递Rectangle
|
||
|
|
printShapeInfo(circle) // 也可以传递Circle
|
||
|
|
```
|
||
|
|
|
||
|
|
### 空接口
|
||
|
|
|
||
|
|
```go
|
||
|
|
var any interface{}
|
||
|
|
any = 10
|
||
|
|
any = "hello"
|
||
|
|
any = []int{1, 2, 3}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 重要提示
|
||
|
|
|
||
|
|
- 接口定义一组方法签名
|
||
|
|
- 任何类型只要实现了接口的所有方法,就自动实现了该接口
|
||
|
|
- 空接口 `interface{}` 可以持有任何类型的值
|
||
|
|
- 接口类型可以包含零个或多个方法
|
||
|
|
|
||
|
|
## 学习目标
|
||
|
|
|
||
|
|
完成本练习后,你将:
|
||
|
|
- ✅ 掌握接口的定义方式
|
||
|
|
- ✅ 学会实现接口
|
||
|
|
- ✅ 理解多态的概念
|
||
|
|
- ✅ 了解空接口的用法
|
||
|
|
|
||
|
|
## 练习说明
|
||
|
|
|
||
|
|
打开 `main.go`,根据注释提示填充代码,完成后运行 `go test -v` 验证答案。
|