🗓️ 02112024 2310
📎
Core Concept: Go always passes arguments by value - copies are made of all parameters, including pointers.
Why It Matters
Explains why modifying parameters doesn't affect original values unless using pointers. Critical for understanding pointers.
When to Use
This is not a pattern to "use" - it's how Go always works. You choose whether to pass values or pointers based on whether you need mutation.
Key Distinction
Pass value:
func increment(x int) {
x = x + 1 // Modifies copy, not original
}
a := 5
increment(a)
fmt.Println(a) // Still 5
Pass pointer (pointer value is copied, but points to same address):
func increment(x *int) {
*x = *x + 1 // Dereferences and modifies original
}
b := 5
increment(&b)
fmt.Println(b) // Now 6
vs Java References
| Java | Go |
|---|---|
| Objects passed by reference | Everything passed by value |
| Primitives passed by value | Pointers passed by value (address copied) |
| No pointer syntax | Explicit & and * |
Trade-offs
Pros: Predictable, no hidden side effects, explicit mutation
Cons: Large structs can be expensive to copy
This is why pointers are necessary - to pass the address (by value) instead of copying large data.
Quick Reference
// Value passed - copy made
func modifyValue(s MyStruct) {
s.Field = "changed" // Changes copy only
}
// Pointer passed - address copied, data accessible
func modifyPointer(s *MyStruct) {
s.Field = "changed" // Changes original
}
// Even the pointer itself is copied!
func reassignPointer(p *int) {
newVal := 100
p = &newVal // Only changes local copy of pointer
}
Key insight: When you pass a pointer, the address is copied, but both the original and copy point to the same memory location.