Methods let you do actions with data stored in a type. Understanding how method calls work helps you write clear and correct programs.
Method call behavior in Go
func (receiver Type) MethodName(params) returnType {
// method body
}The receiver is like the object the method works on.
Receivers can be values or pointers, which affects if the method can change the original data.
Person.type Person struct {
name string
}
func (p Person) Greet() string {
return "Hello, " + p.name
}Person data.func (p *Person) ChangeName(newName string) {
p.name = newName
}Person variable.p := Person{name: "Alice"}
fmt.Println(p.Greet())
p.ChangeName("Bob")
fmt.Println(p.Greet())This program shows how methods with value and pointer receivers behave differently. The Increment method changes the original Counter because it uses a pointer receiver.
package main import "fmt" type Counter struct { count int } // Method with value receiver: cannot change original func (c Counter) Display() { fmt.Println("Count is", c.count) } // Method with pointer receiver: can change original func (c *Counter) Increment() { c.count++ } func main() { c := Counter{count: 5} c.Display() // prints 5 c.Increment() // increases count c.Display() // prints 6 }
Using a pointer receiver lets the method change the original data.
Using a value receiver means the method works on a copy and cannot change the original.
Go lets you call pointer methods on values and value methods on pointers; it handles conversion automatically.
Methods are functions tied to a type using receivers.
Pointer receivers allow methods to modify the original data.
Value receivers work on copies and cannot change the original data.
Practice
Solution
Step 1: Understand value receiver behavior
Methods with value receivers get a copy of the variable, not the original.Step 2: Effect on original variable
Since the method works on a copy, changes inside the method do not affect the original variable.Final Answer:
The method works on a copy of the variable, so original data is not changed. -> Option BQuick Check:
Value receiver = copy, no original change [OK]
- Thinking value receivers modify original data
- Confusing pointer and value receivers
- Assuming method call causes error
Solution
Step 1: Recall pointer receiver syntax
Pointer receivers are declared as (variable *Type) before method name.Step 2: Match correct syntax
func (p *Person) UpdateName(newName string) {} matches the correct syntax: func (p *Person) MethodName(params) {}.Final Answer:
func (p *Person) UpdateName(newName string) {} -> Option AQuick Check:
Pointer receiver syntax = (p *Type) [OK]
- Placing * after type name incorrectly
- Using * before method name
- Confusing pointer receiver with pointer return type
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 call
Increment has a value receiver, so c.count++ modifies a copy, original c.count remains 5.Step 2: Analyze IncrementPtr method call
IncrementPtr has a pointer receiver, so c.count++ modifies original c.count, changing it from 5 to 6.Final Answer:
5\n6 -> Option DQuick Check:
Value receiver no change, pointer receiver changes original [OK]
- Assuming value receiver changes original
- Confusing method call effects
- Ignoring pointer receiver behavior
type Item struct { value int }
func (i Item) SetValue(v int) { i.value = v }
func main() {
item := Item{value: 10}
item.SetValue(20)
fmt.Println(item.value)
}Solution
Step 1: Check method receiver type
SetValue uses a value receiver, so it works on a copy of item.Step 2: Effect on original item
Changes inside SetValue do not affect original item.value, so it remains 10.Final Answer:
SetValue method uses a value receiver, so item.value is not updated. -> Option AQuick Check:
Value receiver means no original update [OK]
- Assuming pointer receiver is mandatory for compilation
- Thinking method return needed to update value
- Ignoring import fmt requirement (not shown here)
package main
import "fmt"
type Number struct { n int }
func (num Number) Double() Number { num.n *= 2; return num }
func (num *Number) Triple() { num.n *= 3 }
func main() {
x := Number{n: 2}
y := x.Double()
y.Triple()
fmt.Println(x.n, y.n)
}Solution
Step 1: Call x.Double()
Double has a value receiver, so it works on a copy of x, doubles n from 2 to 4, and returns it as y.Step 2: Call y.Triple()
Triple has a pointer receiver, so it modifies y.n in place, tripling 4 to 12.Step 3: Print values
x.n remains 2 (unchanged), y.n is 12 after doubling then tripling.Final Answer:
2 12 -> Option CQuick Check:
Value receiver returns copy doubled, pointer receiver modifies copy [OK]
- Assuming x.n changes after Double()
- Confusing which variable is modified by Triple()
- Ignoring return value from Double()
Ready to prove it?
Pass the test and this pattern moves unknown
