Receiver types let you attach functions to your own data types. This helps organize code and work with data easily.
Receiver types in Go
func (receiver ReceiverType) MethodName(params) returnType {
// method body
}The receiver is like a special input that the method uses to access the data.
ReceiverType can be a value type (e.g., MyStruct) or a pointer type (e.g., *MyStruct).
func (p Person) Greet() string {
return "Hello, " + p.Name
}func (p *Person) SetName(newName string) {
p.Name = newName
}This program shows two methods on Person. One reads the name and says hello. The other adds one to the age using a pointer receiver.
package main import "fmt" type Person struct { Name string Age int } // Value receiver: reads data func (p Person) Greet() string { return "Hello, " + p.Name } // Pointer receiver: changes data func (p *Person) HaveBirthday() { p.Age++ } func main() { person := Person{Name: "Alice", Age: 30} fmt.Println(person.Greet()) person.HaveBirthday() fmt.Println("Age after birthday:", person.Age) }
Use pointer receivers when you want to modify the original data.
Use value receivers when you only need to read data and keep the original safe.
Pointer receivers avoid copying the whole struct, which can be faster for big data.
Receiver types let you add methods to your own types.
Value receivers get a copy; pointer receivers get the original to change.
Choose receiver type based on whether you want to modify data or not.
Practice
Solution
Step 1: Understand receiver types
Value receivers receive a copy of the original data, so changes inside the method do not affect the original.Step 2: Pointer receivers behavior
Pointer receivers receive the address of the original data, allowing methods to modify the original value.Final Answer:
Value receivers get a copy of the data; pointer receivers get the original data to modify. -> Option DQuick Check:
Receiver type = copy vs original [OK]
- Thinking value receivers modify original data
- Believing pointer receivers create copies
- Assuming pointer receivers are always slower
Person?Solution
Step 1: Identify pointer receiver syntax
Pointer receivers use an asterisk before the type in the receiver: (p *Person).Step 2: Check method declaration format
The method must be declared with receiver in parentheses before the method name.Final Answer:
func (p *Person) Greet() string { return "Hi" } -> Option BQuick Check:
Pointer receiver syntax = (p *Type) [OK]
- Missing parentheses around receiver
- Placing * after variable name instead of type
- Defining method without receiver
package main
import "fmt"
type Counter struct { count int }
func (c Counter) Increment() { c.count++ }
func (c *Counter) IncrementPtr() { c.count++ }
func main() {
c := Counter{count: 5}
c.Increment()
fmt.Println(c.count)
c.IncrementPtr()
fmt.Println(c.count)
}Solution
Step 1: Analyze Increment method with value receiver
Increment uses a value receiver, so it works on a copy. The original count remains 5 after calling Increment.Step 2: Analyze IncrementPtr method with pointer receiver
IncrementPtr uses a pointer receiver, so it modifies the original count from 5 to 6.Final Answer:
5 6 -> Option AQuick Check:
Value receiver no change, pointer receiver changes [OK]
- Assuming value receiver changes original
- Confusing method calls with pointer vs value receivers
- Expecting both increments to change count
type Rectangle struct { width, height int }
func (r Rectangle) Scale(factor int) {
r.width = r.width * factor
r.height = r.height * factor
}
func main() {
rect := Rectangle{2, 3}
rect.Scale(2)
fmt.Println(rect.width, rect.height)
}Solution
Step 1: Check receiver type in Scale method
Scale uses a value receiver, so it works on a copy and does not modify the original Rectangle.Step 2: Fix receiver to pointer to modify original
Changing receiver to pointer (r *Rectangle) allows Scale to modify the original struct fields.Final Answer:
Scale method should have a pointer receiver to modify Rectangle fields. -> Option CQuick Check:
Modify struct fields = pointer receiver needed [OK]
- Using value receiver expecting changes to persist
- Trying to make struct fields pointers unnecessarily
- Thinking methods must be outside struct
Reset for a struct Timer that sets its seconds field to zero. Which receiver type should you use and why?Solution
Step 1: Understand the goal of Reset method
Reset must change the Timer's seconds field to zero, modifying the original struct.Step 2: Choose receiver type to allow modification
Pointer receiver is needed to modify the original Timer instance inside the method.Final Answer:
Use a pointer receiver because you need to modify the original Timer's seconds field. -> Option AQuick Check:
Modify original struct = pointer receiver [OK]
- Using value receiver expecting original to change
- Returning new struct instead of modifying original
- Using pointer receiver but not modifying fields
Ready to prove it?
Pass the test and this pattern moves unknown
