Value Return Patterns
Single Value Return
The simplest method return pattern involves returning a single value:
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
Multiple Value Returns
Go supports returning multiple values from a method:
func (r Rectangle) Dimensions() (float64, float64) {
return r.Width, r.Height
}
func main() {
rect := Rectangle{Width: 10, Height: 5}
width, height := rect.Dimensions()
}
Named Return Values
Methods can use named return values for clarity:
func (r Rectangle) CalculateMetrics() (area, perimeter float64) {
area = r.Width * r.Height
perimeter = 2 * (r.Width + r.Height)
return
}
Return Patterns Flowchart
graph TD
A[Method Call] --> B{Return Type}
B --> |Single Value| C[Simple Return]
B --> |Multiple Values| D[Multiple Return]
B --> |Named Returns| E[Named Return Values]
Complex Return Patterns
Pattern |
Description |
Example Use Case |
Single Value |
Basic return |
Calculations |
Multiple Values |
Return multiple results |
Coordinate calculations |
Named Returns |
Pre-declared return variables |
Complex computations |
Advanced Return Strategy
type DataProcessor struct {
Data []int
}
func (dp DataProcessor) ProcessData() (result int, processed bool, err error) {
if len(dp.Data) == 0 {
return 0, false, fmt.Errorf("no data to process")
}
sum := 0
for _, val := range dp.Data {
sum += val
}
return sum, true, nil
}
func main() {
processor := DataProcessor{Data: []int{1, 2, 3, 4, 5}}
total, success, err := processor.ProcessData()
if err != nil {
fmt.Println("Processing failed:", err)
return
}
if success {
fmt.Println("Total:", total)
}
}
Best Practices
- Return the most specific type possible
- Use multiple return values for comprehensive results
- Leverage named returns for complex methods
LabEx recommends practicing these return patterns to write more expressive and clear Go methods.