Bird
Raised Fist0
Goprogramming~20 mins

Struct pointers in Go - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Struct Pointer Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of struct pointer field modification
What is the output of this Go program?
Go
package main
import "fmt"
type Person struct {
    Name string
    Age  int
}
func main() {
    p := Person{"Alice", 30}
    ptr := &p
    ptr.Age = 31
    fmt.Println(p.Age)
}
ACompilation error
B0
C30
D31
Attempts:
2 left
💡 Hint
Remember that modifying a struct through its pointer changes the original struct.
❓ Predict Output
intermediate
2:00remaining
Output when assigning struct pointer to another variable
What will be printed by this Go program?
Go
package main
import "fmt"
type Point struct {
    X, Y int
}
func main() {
    p1 := &Point{X: 1, Y: 2}
    p2 := p1
    p2.X = 10
    fmt.Println(p1.X)
}
A0
B1
C10
DCompilation error
Attempts:
2 left
💡 Hint
Both p1 and p2 point to the same struct in memory.
🔧 Debug
advanced
2:00remaining
Identify the runtime error in struct pointer usage
What error does this Go program produce when run?
Go
package main
import "fmt"
type Data struct {
    Value int
}
func main() {
    var d *Data
    d.Value = 5
    fmt.Println(d.Value)
}
Apanic: runtime error: invalid memory address or nil pointer dereference
BOutput: 5
CCompilation error: cannot assign to d.Value
DNo output, program hangs
Attempts:
2 left
💡 Hint
Check if the pointer d is initialized before accessing its fields.
🧠 Conceptual
advanced
2:00remaining
Effect of passing struct pointer to a function
Consider this Go code snippet. What will be the output after calling updateAge(&p)?
Go
package main
import "fmt"
type Person struct {
    Age int
}
func updateAge(p *Person) {
    p.Age = 40
}
func main() {
    p := Person{Age: 25}
    updateAge(&p)
    fmt.Println(p.Age)
}
A25
B40
C0
DCompilation error
Attempts:
2 left
💡 Hint
Passing a pointer allows the function to modify the original struct.
🔧 Debug
expert
2:00remaining
Which option causes a runtime panic with struct pointers?
Given the struct type Node, which code snippet will cause a runtime panic?
Go
type Node struct {
    Value int
    Next  *Node
}
A
var n *Node
n.Value = 10
B
n := &Node{Value: 5}
n.Next = &Node{Value: 10}
C
var n Node
n.Value = 3
D
n := Node{Value: 1}
var p *Node = &n
p.Value = 2
Attempts:
2 left
💡 Hint
Check if the pointer variable is initialized before accessing fields.

Practice

(1/5)
1. What does a struct pointer in Go hold?
type Person struct { Name string }
easy
A. Only the struct's first field value
B. A copy of the struct data
C. The memory address of a struct instance
D. A string representation of the struct

Solution

  1. Step 1: Understand what a pointer stores

    A pointer stores the memory address of a variable, not the variable's value itself.
  2. Step 2: Apply to struct pointers

    A struct pointer holds the address of the struct instance, allowing access or modification of the original struct.
  3. Final Answer:

    The memory address of a struct instance -> Option C
  4. Quick Check:

    Struct pointer = memory address [OK]
Hint: Pointers hold addresses, not copies. Remember & for address [OK]
Common Mistakes:
  • Thinking pointer holds a copy of the struct
  • Confusing pointer with struct value
  • Assuming pointer holds only first field
2. Which of the following is the correct way to declare a pointer to a struct Person in Go?
easy
A. var *p Person
B. var p Person*
C. var p &Person
D. var p *Person

Solution

  1. Step 1: Recall Go pointer syntax

    In Go, a pointer type is declared by placing * before the type name, e.g., *Person.
  2. Step 2: Match correct declaration

    var p *Person uses var p *Person, which is the correct syntax for a pointer variable.
  3. Final Answer:

    var p *Person -> Option D
  4. Quick Check:

    Pointer declaration = *Type [OK]
Hint: Pointer type syntax: *TypeName, not after variable [OK]
Common Mistakes:
  • Placing * after variable name
  • Using & in declaration instead of *
  • Incorrect order of * and type
3. What is the output of this Go program?
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)
}
medium
A. 1
B. 10
C. 0
D. Compilation error

Solution

  1. Step 1: Understand pointer modification

    ptr points to p. Changing ptr.X modifies p.X because ptr references p's memory.
  2. Step 2: Check printed value

    After setting ptr.X = 10, p.X becomes 10. So, printing p.X outputs 10.
  3. Final Answer:

    10 -> Option B
  4. Quick Check:

    Pointer changes original struct field [OK]
Hint: Changing pointer field changes original struct field [OK]
Common Mistakes:
  • Thinking ptr.X is separate copy
  • Expecting original p.X to remain 1
  • Confusing pointer dereference syntax
4. Identify the error in this Go code snippet:
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)
}
medium
A. Passing pointer to function expecting value
B. Missing import for fmt package
C. Cannot assign string to Name field
D. Function parameter should be a pointer to User

Solution

  1. Step 1: Check function parameter type

    Function updateName expects a User value, but main passes &user (a *User pointer).
  2. Step 2: Identify the type mismatch

    This causes a compilation error because the argument type (*User) does not match the parameter type (User).
  3. Final Answer:

    Passing pointer to function expecting value -> Option A
  4. Quick Check:

    Function param must match argument type [OK]
Hint: Match function param type with argument (& for pointer) [OK]
Common Mistakes:
  • Passing pointer to value parameter without pointer receiver
  • Ignoring need to modify original struct
  • Assuming string assignment causes error
5. Given this struct and function:
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?
hard
A. Compilation error at increment(c)
B. Output is 7
C. Output is 6
D. Runtime panic due to invalid pointer

Solution

  1. Step 1: Analyze function calls

    increment expects a *Counter pointer. The first call increment(&c) is correct.
  2. Step 2: Check second call increment(c)

    Passing c (a value) instead of *Counter causes a compilation error because types don't match.
  3. Final Answer:

    Compilation error at increment(c) -> Option A
  4. Quick Check:

    Pointer param requires pointer argument [OK]
Hint: Pointer params need pointer args; value won't auto-convert [OK]
Common Mistakes:
  • Assuming Go auto-converts value to pointer
  • Expecting output 7 without error
  • Ignoring type mismatch in function call
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