package temperature import ( "errors" "fmt" ) type Unit int const ( Celcius Unit = iota Kelvin Fahrenheit ) type Temperature struct { val float32 unit Unit } func New(i float32, u Unit) Temperature { return Temperature{i, u} } func (t Temperature) As(u Unit) (float32, error) { // Convert to celcius var c float32 switch t.unit { case Celcius: c = t.val case Kelvin: c = t.val - 272.15 case Fahrenheit: c = (t.val - 32.0) * (5.0 / 9.0) } // Convert to desired unit switch u { case Celcius: return c, nil case Kelvin: return c + 272.15, nil case Fahrenheit: return c*(9.0/5.0) + 32.0, nil default: return 0, errors.New(fmt.Sprintf("invalid unit: '%v'", u)) } }