🧭 Go Pointer to Pointer – Understand Multi-Level Indirection in Go (2025 Guide)
🧲 Introduction – What Is a Pointer to a Pointer in Go?
In Go, a pointer to a pointer (**T) allows you to reference another pointer, enabling multi-level indirection. While rarely needed in everyday Go programming, it’s useful in cases involving complex data modification, dynamic memory simulation, or C-style interoperability.
🎯 In this section, you’ll learn:
- How to declare and use a pointer to a pointer
- How dereferencing works at multiple levels
- When to use
**Tand potential pitfalls - Real-world scenarios and best practices
✅ Basic Example – Pointer to a Pointer
package main
import "fmt"
func main() {
var x int = 10
var p *int = &x // Pointer to int
var pp **int = &p // Pointer to pointer
fmt.Println("x:", x)
fmt.Println("*p:", *p)
fmt.Println("**pp:", **pp)
}
📤 Output:
x: 10
*p: 10
**pp: 10
✅ pp holds the address of p, which in turn points to x.
🔁 Modifying Value via Pointer to Pointer
func modify(pp **int) {
**pp = 99
}
func main() {
x := 42
p := &x
modify(&p)
fmt.Println(x) // Output: 99
}
✅ This allows the function to modify the original value even deeper in memory.
🧠 When Do You Need a Pointer to a Pointer?
- Nested memory access simulation
- Shared modification of a pointer (not just its value)
- Compatibility with C/C++ libraries via cgo
- Modifying pointer variables inside functions
⚠️ Go Is Not C – Use Slices or Structs Instead
In idiomatic Go:
- You typically avoid
**Tunless interfacing with C - Use slices, structs, or return values to achieve similar outcomes
📚 Real-World Analogy
| Level | Meaning | Example |
|---|---|---|
x | Value | 10 |
*p | Address of x | &x |
**pp | Address of pointer to x | &p |
🧠 Pointer to Pointer Function Signature
func reset(ptr **int) {
*ptr = nil
}
✅ You can reset a pointer inside a function by passing its address (&pointer).
📌 Summary – Recap & Next Steps
Pointers to pointers (**T) in Go offer low-level control, but are generally avoided in favor of cleaner, idiomatic Go alternatives like slices, return values, or struct methods. Use them carefully and only when necessary.
🔍 Key Takeaways:
**Tis a pointer to a pointer to a value of typeT- Allows deep modification and multi-level memory control
- Avoid overusing it—prefer cleaner Go constructs
- Useful in C interop or advanced memory scenarios
⚙️ Next: Learn about Go Interfaces or Struct Embedding for more idiomatic Go patterns.
❓ FAQs – Go Pointer to Pointer
❓ Is **T common in Go programming?
❌ No. It’s rarely used in idiomatic Go unless interfacing with C or complex pointer manipulation is needed.
❓ How do I dereference a pointer to a pointer in Go?
✅ Use **pp to reach the final value when pp is of type **T.
❓ Can I pass a pointer to a pointer to a function?
✅ Yes. Define the parameter as **T and pass using &ptr.
❓ How do I reset a pointer inside a function in Go?
✅ Pass a pointer to the pointer and assign *ptr = nil.
❓ Are there safer alternatives to pointer-to-pointer logic?
✅ Yes. Use slices, structs, or return updated values instead of relying on **T.
Share Now :
