Bird
Raised Fist0
Goprogramming~5 mins

Receiver types in Go - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Receiver types
O(n)
Understanding Time Complexity

When we use receiver types in Go methods, it affects how the program runs. We want to see how the choice between pointer and value receivers changes the work done by the program.

How does the program's work grow when using different receiver types?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.

type Counter struct {
    count int
}

func (c Counter) IncrementValue() {
    c.count++
}

func (c *Counter) IncrementPointer() {
    c.count++
}

This code defines two methods for a Counter type: one uses a value receiver (increments a copy), the other a pointer receiver (increments the original).

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: Incrementing the count field inside the method.
  • How many times: Each method call performs this operation once.

There are no loops or recursion here; the main difference is how the receiver is passed (by value or pointer).

How Execution Grows With Input

Imagine calling these methods many times on a large number of Counter objects.

Input Size (n)Approx. Operations
1010 increments, each copying or referencing one Counter
100100 increments, copying or referencing 100 Counters
10001000 increments, copying or referencing 1000 Counters

Using a value receiver means copying the whole Counter each time, so work grows linearly with n but with extra copying cost. Pointer receivers avoid copying, so work grows linearly but with less overhead.

Final Time Complexity

Time Complexity: O(n)

This means the time to run these methods grows directly with the number of calls, but pointer receivers do less work per call.

Common Mistake

[X] Wrong: "Using a value receiver is always faster because it avoids pointers."

[OK] Correct: Value receivers copy the entire object each call, which can be slower for large structs. Pointer receivers avoid copying and can be more efficient.

Interview Connect

Understanding how receiver types affect performance shows you think about how code runs, not just what it does. This skill helps you write clearer and faster Go programs.

Self-Check

"What if the Counter struct had many fields and was large? How would that change the time complexity impact of using value vs pointer receivers?"

Practice

(1/5)
1. What is the main difference between a value receiver and a pointer receiver in Go methods?
easy
A. Value receivers are faster than pointer receivers in all cases.
B. Value receivers can only read data; pointer receivers can only write data.
C. Pointer receivers create a new copy of the data each time.
D. Value receivers get a copy of the data; pointer receivers get the original data to modify.

Solution

  1. Step 1: Understand receiver types

    Value receivers receive a copy of the original data, so changes inside the method do not affect the original.
  2. Step 2: Pointer receivers behavior

    Pointer receivers receive the address of the original data, allowing methods to modify the original value.
  3. Final Answer:

    Value receivers get a copy of the data; pointer receivers get the original data to modify. -> Option D
  4. Quick Check:

    Receiver type = copy vs original [OK]
Hint: Pointer receivers allow modifying original data, value receivers do not [OK]
Common Mistakes:
  • Thinking value receivers modify original data
  • Believing pointer receivers create copies
  • Assuming pointer receivers are always slower
2. Which of the following is the correct syntax to define a method with a pointer receiver for a struct Person?
easy
A. func (p Person) Greet() string { return "Hi" }
B. func (p *Person) Greet() string { return "Hi" }
C. func Greet(p *Person) string { return "Hi" }
D. func (p Person*) Greet() string { return "Hi" }

Solution

  1. Step 1: Identify pointer receiver syntax

    Pointer receivers use an asterisk before the type in the receiver: (p *Person).
  2. Step 2: Check method declaration format

    The method must be declared with receiver in parentheses before the method name.
  3. Final Answer:

    func (p *Person) Greet() string { return "Hi" } -> Option B
  4. Quick Check:

    Pointer receiver syntax = (p *Type) [OK]
Hint: Pointer receiver syntax uses * before type inside parentheses [OK]
Common Mistakes:
  • Missing parentheses around receiver
  • Placing * after variable name instead of type
  • Defining method without 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 (c *Counter) IncrementPtr() { c.count++ }
func main() {
  c := Counter{count: 5}
  c.Increment()
  fmt.Println(c.count)
  c.IncrementPtr()
  fmt.Println(c.count)
}
medium
A. 5 6
B. 5 5
C. 6 6
D. 6 7

Solution

  1. 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.
  2. Step 2: Analyze IncrementPtr method with pointer receiver

    IncrementPtr uses a pointer receiver, so it modifies the original count from 5 to 6.
  3. Final Answer:

    5 6 -> Option A
  4. Quick Check:

    Value receiver no change, pointer receiver changes [OK]
Hint: Value receiver copies data; pointer receiver changes original [OK]
Common Mistakes:
  • Assuming value receiver changes original
  • Confusing method calls with pointer vs value receivers
  • Expecting both increments to change count
4. Identify the error in this Go code snippet:
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)
}
medium
A. The struct fields width and height must be pointers.
B. Scale method must return a new Rectangle instead of modifying fields.
C. Scale method should have a pointer receiver to modify Rectangle fields.
D. The Scale method should be defined outside the Rectangle type.

Solution

  1. 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.
  2. Step 2: Fix receiver to pointer to modify original

    Changing receiver to pointer (r *Rectangle) allows Scale to modify the original struct fields.
  3. Final Answer:

    Scale method should have a pointer receiver to modify Rectangle fields. -> Option C
  4. Quick Check:

    Modify struct fields = pointer receiver needed [OK]
Hint: Use pointer receiver to change struct fields inside methods [OK]
Common Mistakes:
  • Using value receiver expecting changes to persist
  • Trying to make struct fields pointers unnecessarily
  • Thinking methods must be outside struct
5. You want to create a Go method Reset for a struct Timer that sets its seconds field to zero. Which receiver type should you use and why?
hard
A. Use a pointer receiver because you need to modify the original Timer's seconds field.
B. Use a value receiver because it is simpler and does not modify the original.
C. Use a value receiver and return a new Timer with seconds zeroed.
D. Use a pointer receiver but do not modify any fields inside the method.

Solution

  1. Step 1: Understand the goal of Reset method

    Reset must change the Timer's seconds field to zero, modifying the original struct.
  2. Step 2: Choose receiver type to allow modification

    Pointer receiver is needed to modify the original Timer instance inside the method.
  3. Final Answer:

    Use a pointer receiver because you need to modify the original Timer's seconds field. -> Option A
  4. Quick Check:

    Modify original struct = pointer receiver [OK]
Hint: Modify original struct? Use pointer receiver [OK]
Common Mistakes:
  • Using value receiver expecting original to change
  • Returning new struct instead of modifying original
  • Using pointer receiver but not modifying fields
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard