Bird
Raised Fist0
Goprogramming~10 mins

Passing values vs pointers in Go - Visual Side-by-Side Comparison

Choose your learning style10 modes available
Concept Flow - Passing values vs pointers
Start
↓
Call function with value
↓
Function gets a copy
↓
Modify copy inside function
↓
Return from function
↓
Original variable unchanged
↓
Call function with pointer
↓
Function gets address
↓
Modify value via pointer
↓
Return from function
↓
Original variable changed
↓
End
Shows how passing a value copies data, so original stays same, but passing a pointer lets function change original variable.
Execution Sample
Go
package main
import "fmt"
func incVal(x int) { x = x + 1 }
func incPtr(x *int) { *x = *x + 1 }
func main() {
  a := 5
  incVal(a)
  fmt.Println(a)
  incPtr(&a)
  fmt.Println(a)
}
This code shows incrementing an integer by value (no change) and by pointer (changes original).
Execution Table
StepVariable 'a'Function CalledParameter PassedInside FunctionEffect on 'a'Output
15incVal(a)Value 5x = 5 + 1 = 6No change to 'a'
25Return from incVal--'a' still 5
35fmt.Println(a)---5
45incPtr(&a)Pointer to 'a'*x = 5 + 1 = 6'a' changed to 6
56Return from incPtr--'a' now 6
66fmt.Println(a)---6
💡 'main' ends after printing updated 'a' value
Variable Tracker
VariableStartAfter incValAfter incPtrFinal
a5566
x (incVal)-6--
x (incPtr)--6-
Key Moments - 3 Insights
Why does 'a' not change after calling incVal?
Because incVal receives a copy of 'a' (see execution_table step 1), so changes inside do not affect original 'a'.
How does incPtr change the original 'a'?
incPtr receives a pointer to 'a' (step 4), so modifying *x changes the actual 'a' variable.
What does the & operator do in incPtr(&a)?
It gives the address of 'a', so the function can access and modify the original variable.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 2, what is the value of 'a' after incVal returns?
A5
B6
CUndefined
D0
💡 Hint
Check the 'Effect on a' column at step 2 in execution_table.
At which step does 'a' first change its value?
AStep 1
BStep 3
CStep 4
DStep 6
💡 Hint
Look for when 'Effect on a' shows a change in execution_table.
If incVal was changed to accept a pointer instead, what would happen to 'a' after calling incVal(&a)?
A'a' would remain unchanged
B'a' would change like in incPtr
CCompilation error
D'a' would become zero
💡 Hint
Compare incVal and incPtr parameter types and effects in variable_tracker.
Concept Snapshot
Passing by value copies data to function, so original variable stays same.
Passing by pointer sends address, so function can modify original.
Use & to get address, * to access value via pointer.
Changes via pointer affect original variable.
Value passing is safe but no side effects.
Pointer passing allows modification but needs care.
Full Transcript
This visual trace shows how Go functions receive arguments either by value or by pointer. When a value is passed, the function works on a copy, so changes inside do not affect the original variable. When a pointer is passed, the function gets the address and can modify the original variable's value. The example increments an integer first by value (no change) and then by pointer (changes original). The execution table tracks each step, showing variable values and effects. Key moments clarify why the original variable changes only with pointers. The quiz tests understanding of these steps and effects.

Practice

(1/5)
1. What happens when you pass a variable to a function by value in Go?
easy
A. The function receives a copy; changes inside do not affect the original variable.
B. The function receives the original variable; changes inside affect the original.
C. The function cannot modify the variable at all.
D. The function receives a reference but cannot change the original variable.

Solution

  1. Step 1: Understand passing by value

    Passing by value means the function gets a copy of the variable, not the original.
  2. Step 2: Effect of changes inside the function

    Changes to the copy do not affect the original variable outside the function.
  3. Final Answer:

    The function receives a copy; changes inside do not affect the original variable. -> Option A
  4. Quick Check:

    Passing by value = copy, no original change [OK]
Hint: Passing by value means function works on a copy [OK]
Common Mistakes:
  • Thinking changes inside function affect original variable
  • Confusing pointers with values
  • Assuming function cannot modify any data
2. Which of the following is the correct way to declare a function parameter as a pointer in Go?
easy
A. func updateValue(val *int) {}
B. func updateValue(&val int) {}
C. func updateValue(val int) {}
D. func updateValue(*val int) {}

Solution

  1. Step 1: Recall pointer syntax in Go function parameters

    In Go, a pointer parameter is declared by placing * before the type, e.g., *int.
  2. Step 2: Identify correct syntax

    func updateValue(val *int) {} is correct syntax, with * before the type. func updateValue(val int) {} declares a value parameter. func updateValue(&val int) {} and func updateValue(*val int) {} have invalid syntax.
  3. Final Answer:

    func updateValue(val *int) {} -> Option A
  4. Quick Check:

    Pointer parameter syntax = *type [OK]
Hint: Pointer parameter uses * before type, not variable name [OK]
Common Mistakes:
  • Putting * before variable name instead of type
  • Using & in parameter declaration
  • Confusing pointer syntax with value parameter
3. What is the output of this Go program?
package main
import "fmt"
func changeValue(val int) {
    val = 10
}
func main() {
    x := 5
    changeValue(x)
    fmt.Println(x)
}
medium
A. 10
B. 5
C. 0
D. Compilation error

Solution

  1. Step 1: Analyze function parameter passing

    The function changeValue receives x by value, so val is a copy of x.
  2. Step 2: Check if original variable changes

    Inside changeValue, val is set to 10, but this does not affect x in main.
  3. Final Answer:

    5 -> Option B
  4. Quick Check:

    Passing by value means original x stays 5 [OK]
Hint: Passing by value means original variable unchanged [OK]
Common Mistakes:
  • Assuming x changes to 10 after function call
  • Confusing pointer and value passing
  • Expecting compilation error due to assignment
4. Identify the error in this Go code snippet:
func increment(num *int) {
    num = num + 1
}

func main() {
    x := 5
    increment(&x)
    fmt.Println(x)
}
medium
A. Missing & operator when calling increment.
B. x is not initialized before use.
C. Function parameter should not be a pointer.
D. Cannot add 1 to a pointer directly; need to dereference first.

Solution

  1. Step 1: Understand pointer arithmetic in Go

    Go does not support arithmetic on pointers like 'num + 1'. You must dereference the pointer to change the value.
  2. Step 2: Correct way to increment value pointed by pointer

    Use '*num = *num + 1' to increment the value at the pointer address.
  3. Final Answer:

    Cannot add 1 to a pointer directly; need to dereference first. -> Option D
  4. Quick Check:

    Pointer arithmetic invalid; dereference to modify [OK]
Hint: Use * to access pointer value before arithmetic [OK]
Common Mistakes:
  • Trying to add directly to pointer variable
  • Forgetting to dereference pointer
  • Confusing pointer and value types
5. You want to write a function in Go that doubles the value of an integer variable passed to it. Which approach correctly modifies the original variable?
hard
A. Return the doubled value and assign it outside the function.
B. Pass the integer by value and assign double inside the function.
C. Pass a pointer to the integer and modify the value via dereferencing.
D. Use a global variable instead of passing parameters.

Solution

  1. Step 1: Understand how to modify original variable

    Passing by value copies the variable, so changes inside function won't affect original.
  2. Step 2: Use pointer to modify original variable

    Passing a pointer allows the function to access and change the original variable's value via dereferencing.
  3. Step 3: Consider alternatives

    Returning doubled value requires assignment outside; using global variables is bad practice.
  4. Final Answer:

    Pass a pointer to the integer and modify the value via dereferencing. -> Option C
  5. Quick Check:

    Pointer passing modifies original variable [OK]
Hint: Use pointer to change original variable inside function [OK]
Common Mistakes:
  • Assuming passing by value changes original variable
  • Relying on return value without assignment
  • Using global variables unnecessarily
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