A value receiver lets a method operate on a copied value of its receiver type. It fits conversion methods that calculate and return a new Measurement rather than modifying the receiver. section 5.5
In a measurement conversion model, MetricWeight, ImperialWeight, MetricVolume, and ImperialVolume use value receivers to implement ToImperial and ToMetric. Each method returns a converted Measurement or the original value when no conversion is needed. section 5.5
func (m MetricWeight) ToImperial() Measurement {
// 1 gram is about 0.035274 ounces
return Measurement{
Magnitude: m.Magnitude * 0.035274,
Unit: Ounce,
}
}
func (m MetricWeight) ToMetric() Measurement {
return m.Measurement
}
func (i ImperialWeight) ToMetric() Measurement {
// 1 ounce ≈ 28.3495 grams
return Measurement{
Magnitude: i.Magnitude * 28.3495,
Unit: Gram,
}
}
func (i ImperialWeight) ToImperial() Measurement {
return i.Measurement
}
func (m MetricVolume) ToImperial() Measurement {
// 1 liter ≈ 2.11338 pints
return Measurement{
Magnitude: m.Magnitude * 2.11338,
Unit: Pint,
}
}
func (m MetricVolume) ToMetric() Measurement {
return m.Measurement
}
func (i ImperialVolume) ToMetric() Measurement {
// 1 pint ≈ 0.473176 liters
return Measurement{
Magnitude: i.Magnitude * 0.473176,
Unit: Liter,
}
}
func (i ImperialVolume) ToImperial() Measurement {
return i.Measurement
}
Compare value-receiver conversion methods that construct new Measurement values with methods that return the receiver's embedded Measurement unchanged. section 5.5


