回顾:形状计算器
本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 33 课,共 107 课。
挑战
简单让我们来构建一个形状计算器,把本章中的所有接口概念融会贯通。你将创建一个系统,通过共享接口统一处理不同的几何形状,展示 Go 中多态的强大之处。
你需要把代码分成三个文件:
shape.go:定义一个包含两个方法的Shape接口:Area() float64和Perimeter() float64。再创建一个名为DescribeShape的函数,它接受任意Shape,并返回一个格式化字符串,显示其面积和周长。shapes.go:创建两个实现Shape接口的结构体:- 一个包含
Width和Height字段的Rectangle - 一个包含
Radius字段的Circle
Area()和Perimeter()方法,以及一个String()方法(实现fmt.Stringer),用于返回形状的易读描述。- 一个包含
main.go:从输入中读取形状数据,创建相应的形状,并使用你的DescribeShape函数显示每个形状的信息。还要直接打印每个形状,以展示Stringer接口。
输入内容如下:
- 第 1 行:矩形的宽(浮点数)
- 第 2 行:矩形的高(浮点数)
- 第 3 行:圆的半径(浮点数)
计算时,使用 3.14159 作为 pi 的值。圆的周长为 2 * pi * radius。
你的 String() 方法应返回:
- 矩形:
Rectangle(Width x Height) - 圆:
Circle(Radius: R)
你的 DescribeShape 函数应返回:
Area: [area], Perimeter: [perimeter]使用 %.2f 将所有浮点数格式化为两位小数。
例如,输入 4、3 和 5 后,输出应为:
Rectangle(4.00 x 3.00)
Area: 12.00, Perimeter: 14.00
Circle(Radius: 5.00)
Area: 78.54, Perimeter: 31.42先打印每个形状(使用它的 String() 方法),再打印它通过 DescribeShape 得到的描述。先处理矩形,再处理圆。
亲手试试
package main
import (
"fmt"
)
func main() {
// 读取输入值
var width, height, radius float64
fmt.Scanln(&width)
fmt.Scanln(&height)
fmt.Scanln(&radius)
// TODO: 用给定的 width 和 height 创建一个 Rectangle
// TODO: 用给定的 radius 创建一个 Circle
// TODO: 打印矩形(使用 String() 方法)
// TODO: 使用 DescribeShape() 打印矩形的描述
// TODO: 打印圆形(使用 String() 方法)
// TODO: 使用 DescribeShape() 打印圆形的描述
}
面向对象编程中的所有课
自己练习: Go 在线编译器