Struct pointers in Go - Time & Space Complexity
When working with struct pointers in Go, it's important to understand how the program's running time changes as we use these pointers.
We want to know how the number of steps grows when accessing or modifying data through struct pointers.
Analyze the time complexity of the following code snippet.
package main
type Node struct {
value int
next *Node
}
func sumList(head *Node) int {
sum := 0
for current := head; current != nil; current = current.next {
sum += current.value
}
return sum
}
This code sums all values in a linked list by following struct pointers from one node to the next.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Looping through each node by following the
nextpointer. - How many times: Once for each node in the list, until the end is reached.
As the list gets longer, the loop runs more times, once per node.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 steps |
| 100 | About 100 steps |
| 1000 | About 1000 steps |
Pattern observation: The number of steps grows directly with the number of nodes.
Time Complexity: O(n)
This means the time to sum the list grows in a straight line with the number of nodes.
[X] Wrong: "Using pointers makes the code run instantly or in constant time."
[OK] Correct: Even with pointers, you still need to visit each node one by one, so time grows with list size.
Understanding how following struct pointers affects time helps you explain linked list operations clearly and confidently.
"What if we changed the linked list to a tree structure? How would the time complexity change when summing all values?"
Practice
type Person struct { Name string }Solution
Step 1: Understand what a pointer stores
A pointer stores the memory address of a variable, not the variable's value itself.Step 2: Apply to struct pointers
A struct pointer holds the address of the struct instance, allowing access or modification of the original struct.Final Answer:
The memory address of a struct instance -> Option CQuick Check:
Struct pointer = memory address [OK]
- Thinking pointer holds a copy of the struct
- Confusing pointer with struct value
- Assuming pointer holds only first field
Person in Go?Solution
Step 1: Recall Go pointer syntax
In Go, a pointer type is declared by placing * before the type name, e.g., *Person.Step 2: Match correct declaration
var p *Person usesvar p *Person, which is the correct syntax for a pointer variable.Final Answer:
var p *Person -> Option DQuick Check:
Pointer declaration = *Type [OK]
- Placing * after variable name
- Using & in declaration instead of *
- Incorrect order of * and type
package main
import "fmt"
type Point struct { X, Y int }
func main() {
p := Point{1, 2}
ptr := &p
ptr.X = 10
fmt.Println(p.X)
}Solution
Step 1: Understand pointer modification
ptr points to p. Changing ptr.X modifies p.X because ptr references p's memory.Step 2: Check printed value
After setting ptr.X = 10, p.X becomes 10. So, printing p.X outputs 10.Final Answer:
10 -> Option BQuick Check:
Pointer changes original struct field [OK]
- Thinking ptr.X is separate copy
- Expecting original p.X to remain 1
- Confusing pointer dereference syntax
package main
import "fmt"
type User struct { Name string }
func updateName(u User) {
u.Name = "Alice"
}
func main() {
user := User{"Bob"}
updateName(&user)
fmt.Println(user.Name)
}Solution
Step 1: Check function parameter type
Function updateName expects a User value, but main passes &user (a *User pointer).Step 2: Identify the type mismatch
This causes a compilation error because the argument type (*User) does not match the parameter type (User).Final Answer:
Passing pointer to function expecting value -> Option AQuick Check:
Function param must match argument type [OK]
- Passing pointer to value parameter without pointer receiver
- Ignoring need to modify original struct
- Assuming string assignment causes error
package main
import "fmt"
type Counter struct { Count int }
func increment(c *Counter) {
c.Count++
}
func main() {
c := Counter{Count: 5}
increment(&c)
increment(c)
fmt.Println(c.Count)
}What will happen when running this program?
Solution
Step 1: Analyze function calls
increment expects a *Counter pointer. The first call increment(&c) is correct.Step 2: Check second call increment(c)
Passing c (a value) instead of *Counter causes a compilation error because types don't match.Final Answer:
Compilation error at increment(c) -> Option AQuick Check:
Pointer param requires pointer argument [OK]
- Assuming Go auto-converts value to pointer
- Expecting output 7 without error
- Ignoring type mismatch in function call
Ready to prove it?
Pass the test and this pattern moves unknown
