Menu
CoddyTech

回顾:形状计算器

本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 33 课,共 107 课。

challenge icon

挑战

简单

让我们来构建一个形状计算器,把本章中的所有接口概念融会贯通。你将创建一个系统,通过共享接口统一处理不同的几何形状,展示 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 在线编译器