package main
import (
"errors"
"fmt"
"math"
)
// CircleMetrics holds the calculated geometric properties of a circle.
type CircleMetrics struct {
Diameter float64
Circumference float64
Area float64
}
// CalculateCircleMetrics computes the diameter, circumference, and area of a circle.
// Returns an error if the provided radius is negative.
func CalculateCircleMetrics(radius float64) (CircleMetrics, error) {
// Guard clause: radius cannot be negative
if radius < 0 {
return CircleMetrics{}, errors.New("radius cannot be negative")
}
diameter := 2.0 * radius
circumference := 2.0 * math.Pi * radius
// Standard multiplication (radius * radius) is more efficient than math.Pow(radius, 2)
area := math.Pi * (radius * radius)
return CircleMetrics{
Diameter: diameter,
Circumference: circumference,
Area: area,
}, nil
}
func main() {
radius := 3.0
// Call the function and handle the returned error idiomatically
metrics, err := CalculateCircleMetrics(radius)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
// Output results formatted to 2 decimal places using Printf
fmt.Printf("Radius: %.2f\n", radius)
fmt.Printf("Diameter: %.2f\n", metrics.Diameter)
fmt.Printf("Circumference: %.2f\n", metrics.Circumference)
fmt.Printf("Area: %.2f\n", metrics.Area)
}
/*
run:
Radius: 3.00
Diameter: 6.00
Circumference: 18.85
Area: 28.27
*/