Value receivers let you use a copy of a value when calling a method. This means the original value stays safe and unchanged.
When you want to make sure the original data does not change inside the method.
When your data is small and copying it is cheap and fast.
When you want to call methods on values, not pointers.
When you want to keep your code simple and avoid pointer complexity.
Syntax
Go
func (v Type) MethodName() {
// method body
}
The receiver v is a copy of the original value.
Changes to v inside the method do not affect the original.
Examples
This method uses a value receiver. It changes the copy, not the original Point.
Go
type Point struct {
X, Y int
}
func (p Point) Move() {
p.X += 1
p.Y += 1
}
This method just reads the value and prints it. Using a value receiver is fine here.
Go
func (p Point) Display() {
fmt.Printf("Point is at (%d, %d)\n", p.X, p.Y)
}
Sample Program
We create a Point and call Move which uses a value receiver. The original pt does not change because Move works on a copy. Then Display shows the original coordinates.
Go
package main
import"fmt"
type Point struct {
X, Y int
}
func (p Point) Move() {
p.X += 1
p.Y += 1
}
func (p Point) Display() {
fmt.Printf("Point is at (%d, %d)\n", p.X, p.Y)
}
func main() {
pt := Point{X: 5, Y: 10}
pt.Move() // This changes the copy, not pt
pt.Display() // Prints original values
}
OutputSuccess
Important Notes
Value receivers get a copy, so big structs might be slower to copy.
If you want to change the original value, use pointer receivers instead.
Methods with value receivers can be called on both values and pointers.
Summary
Value receivers use a copy of the value inside methods.
They keep the original value safe from changes.
Good for small data or read-only methods.
Practice
(1/5)
1. What does a value receiver method in Go do when called on a struct?
easy
A. It requires a pointer to the struct to work.
B. It modifies the original struct directly.
C. It works on a copy of the struct, leaving the original unchanged.
D. It only works with built-in types, not structs.
Solution
Step 1: Understand value receiver behavior
Value receivers get a copy of the struct, so changes inside the method do not affect the original.
Step 2: Compare with pointer receivers
Pointer receivers work on the original struct, but value receivers do not.
Final Answer:
It works on a copy of the struct, leaving the original unchanged. -> Option C
Quick Check:
Value receiver = copy, no original change [OK]
Hint: Value receivers copy data; original stays safe [OK]
Common Mistakes:
Thinking value receivers modify the original struct
Confusing value and pointer receivers
Assuming value receivers require pointers
2. Which of the following is the correct syntax to define a method with a value receiver in Go?
easy
A. func greet(p Person) {}
B. func (p Person) greet() {}
C. func (p *Person) greet() {}
D. func greet(*Person) {}
Solution
Step 1: Identify method receiver syntax
Methods with receivers use the syntax: func (receiver Type) methodName() {}.
Step 2: Distinguish value vs pointer receiver
Value receiver uses the type directly (e.g., Person), pointer receiver uses *Person.
Final Answer:
func (p Person) greet() {} -> Option B
Quick Check:
Value receiver syntax = func (p Type) method() [OK]
Hint: Value receiver uses type, pointer uses *type [OK]
Common Mistakes:
Using pointer syntax for value receiver
Defining method without receiver
Confusing function parameter with method receiver
3. What will be the output of this Go program?
package main
import "fmt"
type Counter struct { count int }
func (c Counter) increment() {
c.count++
}
func main() {
c := Counter{count: 5}
c.increment()
fmt.Println(c.count)
}
medium
A. 5
B. 6
C. 0
D. Compilation error
Solution
Step 1: Analyze increment method with value receiver
The increment method uses a value receiver, so it works on a copy of Counter, not the original.
Step 2: Check effect on original Counter
Incrementing c.count inside the method changes only the copy; original c.count remains 5.
Final Answer:
5 -> Option A
Quick Check:
Value receiver method does not change original value [OK]
Hint: Value receiver methods don't change original struct [OK]
Common Mistakes:
Assuming increment changes original count
Confusing value and pointer receivers
Expecting output 6 instead of 5
4. Identify the problem in this Go code snippet and fix it:
type Point struct { x, y int }
func (p Point) move(dx, dy int) {
p.x += dx
p.y += dy
}
func main() {
pt := Point{1, 2}
pt.move(3, 4)
fmt.Println(pt)
}
medium
A. Use global variables instead of struct fields
B. Return new Point from move method
C. No fix needed; code works as intended
D. Change method receiver to pointer: func (p *Point) move(dx, dy int)
Solution
Step 1: Understand why move method doesn't update original
Method uses value receiver, so changes affect only a copy, not original Point.
Step 2: Fix by using pointer receiver
Changing receiver to *Point allows method to modify original struct fields.
Final Answer:
Change method receiver to pointer: func (p *Point) move(dx, dy int) -> Option D
Quick Check:
Pointer receiver needed to modify original struct [OK]
Hint: Use pointer receiver to modify struct fields [OK]
Common Mistakes:
Not using pointer receiver for modifying methods
Trying to fix by returning new struct without assignment
Ignoring that value receiver copies struct
5. You have a struct Book with a method Display() using a value receiver. You want to add a method UpdateTitle(newTitle string) that changes the title. Which is the best approach?
hard
A. Define UpdateTitle with a pointer receiver to modify the original Book.
B. Define UpdateTitle with a value receiver and assign the new title inside it.
C. Keep both methods with value receivers for consistency.
D. Make Display use a pointer receiver instead of value receiver.
Solution
Step 1: Understand method receiver choice for updating data
To change the original struct, methods must use pointer receivers.
Step 2: Decide best practice for mixed methods
It's fine to have Display use value receiver (read-only), and UpdateTitle use pointer receiver (modifies data).
Final Answer:
Define UpdateTitle with a pointer receiver to modify the original Book. -> Option A
Quick Check:
Modify method uses pointer receiver; read-only can use value [OK]
Hint: Use pointer receiver for methods that change data [OK]
Common Mistakes:
Using value receiver for methods that modify struct
Changing all methods to pointer receivers unnecessarily
Confusing method consistency with receiver type
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.