Go (Golang) is a powerful, statically typed language built for simplicity, performance, and scalability. One of the key features that sets Go apart from many high-level languages is its support for pointers, which allow you to directly reference memory addresses.
In this blog, you’ll learn everything you need to know about pointers in Go — from what they are and why they matter, to how they’re used in real-world applications.
📌 What is a Pointer?
A pointer is a variable that holds the memory address of another variable.
👉 Analogy:
Think of a variable as a house and its value as a person living inside. A pointer is like the house’s address written on a note. You don’t carry the person — you carry the address.
🧪 Basic Pointer Syntax in Go
var x int = 10 var p *int = &x
-
x
is anint
variable. -
&x
gives the memory address ofx
. -
p
is a pointer to int (*int
) that stores that address.
🔍 Dereferencing
To get the value stored at the pointer address:
fmt.Println(*p) // Output: 10
⚙️ Why Use Pointers?
- 🔁 Avoid copying large values (performance gain).
- 🧠 Modify values inside functions.
- ⚒️ Work with dynamic data structures (like linked lists, trees).
- 🚀 Share state between functions or goroutines.
🧑💻 Example: Modify Value via Pointer
func update(val *int) { *val = 99 } func main() { num := 50 update(&num) fmt.Println(num) // Output: 99 }
✅ *val = 99
changes the original num
since we're working with its memory address.
🆚 Value vs Pointer
Feature | Value (Copy) | Pointer (Reference) |
---|---|---|
Memory usage | More (copies value) | Less (copies address) |
Modify original? | ❌ No | ✅ Yes |
Performance | Slower with large data | Faster |
🆕 The new()
Keyword
ptr := new(int) *ptr = 77 fmt.Println(*ptr) // Output: 77
-
new(int)
allocates memory for anint
and returns a pointer to it. - The pointer’s default value is zero.
👤 Pointers with Structs
type User struct { Name string } func rename(u *User) { u.Name = "Alice" } func main() { user := User{Name: "Bob"} rename(&user) fmt.Println(user.Name) // Output: Alice }
✅ Modifications inside the function persist outside because we pass a pointer.
🧠 Common Pitfalls
- ❌ Dereferencing a nil pointer
var p *int fmt.Println(*p) // panic: runtime error: invalid memory address
- ✅ Always check for
nil
:
if p != nil { fmt.Println(*p) }
🔄 Passing by Value vs Pointer (Recap)
Case | Use Pointer? |
---|---|
Modify original data | ✅ Yes |
Pass large structs | ✅ Yes |
Read-only small values | ❌ No |
🔚 Conclusion
Pointers are a core concept in Go that unlock performance, control, and flexibility. By mastering pointers, you gain a deeper understanding of how data flows and memory works under the hood — critical skills for any serious Go developer.
✨ Remember: With great power (pointers), comes great responsibility (memory safety)!
Top comments (1)
DON'T Dereferencing a NOT nil pointer