package main

import (
	"fmt"
	"math"
)

// 1. 接口：只要实现了 Area() float64 就是 Shape
type Shape interface {
	Area() float64
}

// 2. 矩形
type Rect struct {
	W, H float64
}

// 3. 圆
type Circle struct {
	R float64
}

// 4. 隐式实现：Rect 有了 Area() float64 → 自动变成 Shape
func (r Rect) Area() float64 {
	return r.W * r.H
}

// 5. 隐式实现：Circle 同理
func (c Circle) Area() float64 {
	return math.Pi * c.R * c.R
}

// 6. 统一打印面积：多态
func printArea(s Shape) {
	fmt.Printf("面积 = %.2f\n", s.Area())
}

func main() {
	// 7. 接口变量可以装任何实现者
	var s Shape

	s = Rect{3, 4}
	printArea(s) // 12.00

	s = Circle{R: 2}
	printArea(s) // 12.57

	// 8. 空接口：万能容器（类似 Python 的 object）
	var box interface{}
	box = 42
	box = "hello"
	box = Rect{1, 1}
	fmt.Println("空接口里装的是：", box)
}
