Understanding Pointers in Go

List Topics
February 15, 2025
No Comments
7 min read

What is a Pointer?

A pointer is a variable that stores the memory address of another variable. Instead of holding a direct value, it holds a reference to a value stored elsewhere in memory.

👉 Pointers are used for efficient memory management and allow modifying variables indirectly by passing their address instead of a copy.

1ī¸âƒŖ Declaring a Pointer in Go

In Go, a pointer is declared using the * (asterisk) symbol.

🔹 Syntax:

Go
var ptr *int  // Declares a pointer to an integer

By default, an uninitialized pointer has a zero value of nil, meaning it doesn’t point to any valid memory address.

🔹 Example:

Go
package main

import "fmt"

func main() {
    var ptr *int  // Declaring a pointer
    fmt.Println("Pointer value:", ptr) // nil (default value)
}

🔹 Output:

Bash
Pointer value: <nil>

2ī¸âƒŖ Getting the Address of a Variable (& Operator)

The address-of operator (&) is used to get the memory address of a variable.

🔹 Example:

Go
package main

import "fmt"

func main() {
    num := 42
    ptr := &num  // Getting the memory address of num

    fmt.Println("Value of num:", num)
    fmt.Println("Address of num:", ptr)  // Pointer holds the memory address
}

🔹 Output:

Bash
Value of num: 42
Address of num: 0xc000014080  // (example memory address)

👉 &num returns the memory address of num, which is stored in ptr.

3ī¸âƒŖ Dereferencing a Pointer (* Operator)

The dereference operator (*) is used to access the value stored at a pointer’s address.

🔹 Example:

Go
package main

import "fmt"

func main() {
    num := 42
    ptr := &num  // Pointer to num

    fmt.Println("Pointer address:", ptr)
    fmt.Println("Value at pointer address:", *ptr)  // Dereferencing pointer
}

🔹 Output:

Bash
Pointer address: 0xc000014080  // (example memory address)
Value at pointer address: 42

👉 *ptr dereferences the pointer and retrieves the value stored at that address.

4ī¸âƒŖ Modifying Values via Pointers

Pointers allow modifying the original value by dereferencing them.

🔹 Example:

Go
package main

import "fmt"

func main() {
    num := 10
    ptr := &num  // Pointer to num

    *ptr = 20  // Modifying the original value through the pointer

    fmt.Println("Updated num:", num) // num is now 20
}

🔹 Output:

Bash
Updated num: 20

👉 Since ptr points to num, modifying *ptr changes the original variable’s value.

5ī¸âƒŖ Pointers as Function Parameters (Pass by Reference)

Passing a pointer to a function allows modifying the original variable instead of a copy.

🔹 Example:

Go
package main

import "fmt"

// Function that modifies the value using a pointer
func updateValue(ptr *int) {
    *ptr = *ptr + 5  // Dereferencing and modifying value
}

func main() {
    num := 10
    updateValue(&num)  // Passing address of num

    fmt.Println("Updated num:", num)  // num is modified
}

🔹 Output:

Bash
Updated num: 15

👉 Here, updateValue receives a pointer and modifies the original value by dereferencing it.

6ī¸âƒŖ Pointer to a Pointer (Double Pointer)

A pointer can store the address of another pointer.

🔹 Example:

Go
package main

import "fmt"

func main() {
    num := 50
    ptr := &num   // Pointer to num
    pptr := &ptr  // Pointer to pointer

    fmt.Println("Value of num:", num)
    fmt.Println("Pointer to num:", ptr)
    fmt.Println("Pointer to pointer:", pptr)
    fmt.Println("Value using double pointer:", **pptr) // Dereferencing twice
}

🔹 Output:

Bash
Value of num: 50
Pointer to num: 0xc000014080
Pointer to pointer: 0xc000006028
Value using double pointer: 50

👉 pptr stores the address of ptr, and **pptr retrieves the original value (num).

7ī¸âƒŖ Pointers with Structs

Pointers are commonly used with structs to modify their fields efficiently.

🔹 Example:

Go
package main

import "fmt"

type Person struct {
    name string
    age  int
}

func updateAge(p *Person) {
    p.age = p.age + 1  // Modifying struct field via pointer
}

func main() {
    p1 := Person{"Alice", 25}
    updateAge(&p1)  // Passing struct pointer

    fmt.Println("Updated Age:", p1.age)
}

🔹 Output:

Bash
Updated Age: 26

👉 Since p is a pointer to Person, modifying p.age updates p1.age.

8ī¸âƒŖ New vs. Make for Pointers

🔹 Using new()

new() allocates memory for a single variable and returns a pointer.

Go
package main

import "fmt"

func main() {
    ptr := new(int)  // Allocating memory for an integer
    *ptr = 100
    fmt.Println("Value at ptr:", *ptr)
}

🔹 Output:

Bash
Value at ptr: 100

👉 new(int) allocates memory for an integer and returns a pointer to it.

🔹 Using make()

make() is used for slices, maps, and channels, as it initializes internal structures.

Go
package main

import "fmt"

func main() {
    myMap := make(map[string]int)  // Allocates and initializes map
    myMap["age"] = 30
    fmt.Println(myMap)
}

🔹 Output:

Bash
map[age:30]

👉 make() initializes a map (or slice/channel), whereas new() only allocates memory.

9ī¸âƒŖ Nil Pointers and Avoiding Dereferencing Errors

A nil pointer is an uninitialized pointer and causes runtime errors if dereferenced.

🔹Example:

Go
package main

import "fmt"

func main() {
    var ptr *int  // Nil pointer (uninitialized)
    
    if ptr == nil {
        fmt.Println("Pointer is nil, avoiding dereferencing.")
    } else {
        fmt.Println(*ptr)  // Error if dereferenced
    }
}

🔹 Output:

Bash
Pointer is nil, avoiding dereferencing.

👉 Always check for nil before dereferencing a pointer to avoid runtime errors.

🔹 Summary Table

FeatureDescription
Pointer Declarationvar ptr *int
Get Address (&)ptr = &num
Dereference (*)value := *ptr
Modify Value*ptr = newValue
Pass to Functionfunc update(ptr *int)
Pointer to Pointerpptr := &ptr, **pptr
Struct Pointerfunc modify(p *Person)
New vs. Makenew() (memory allocation), make() (slice/map/channel init)

🚀 Pointers in Go improve efficiency, reduce memory overhead, and allow modifying original data without copying! 🚀


Go āϤ⧇ Pointer āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇ (āĻŦāĻŋāĻļāĻĻ āĻŦā§āϝāĻžāĻ–ā§āϝāĻž)

Pointer āϕ⧀?

Pointer āĻāĻ•āϟāĻŋ āĻ­ā§āϝāĻžāϰāĻŋāϝāĻŧ⧇āĻŦāϞ āϝāĻž āĻ…āĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ­ā§āϝāĻžāϰāĻŋāϝāĻŧ⧇āĻŦāϞ āĻāϰ āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻ āĻŋāĻ•āĻžāύāĻž āϧāϰ⧇ āϰāĻžāϖ⧇āĨ¤ āϏāϰāĻžāϏāϰāĻŋ āĻāĻ•āϟāĻŋ āĻŽāĻžāύ āϧāϰ⧇ āϰāĻžāĻ–āĻžāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇, āĻāϟāĻŋ āĻŽā§‡āĻŽā§‹āϰāĻŋāϰ āĻ…āĻ¨ā§āϝ āϕ⧋āĻĨāĻžāĻ“ āĻĨāĻžāĻ•āĻž āĻāĻ•āϟāĻŋ āĻŽāĻžāύ⧇āϰ āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ āϧāϰ⧇ āϰāĻžāϖ⧇āĨ¤

👉 Pointers āϕ⧇āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ?

  • āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻž āφāϰ⧋ āĻ•āĻžāĻ°ā§āϝāĻ•āϰāĻ­āĻžāĻŦ⧇ āĻ•āϰāϤ⧇ āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āĻāϟāĻŋ āĻ­ā§āϝāĻžāϰāĻŋāϝāĻŧ⧇āĻŦāϞāϗ⧁āϞāĻŋāϕ⧇ āϤāĻžāĻĻ⧇āϰ āĻ āĻŋāĻ•āĻžāύāĻž āĻĒāĻžāϏ āĻ•āϰāĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧ, āĻŽāĻžāύ⧇āϰ āĻ•āĻĒāĻŋ āĻ•āϰāĻžāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇āĨ¤

1ī¸âƒŖ Go-āϤ⧇ Pointer āĻ˜ā§‹āώāĻŖāĻž āĻ•āϰāĻž

Go-āϤ⧇, Pointer āĻ˜ā§‹āώāĻŖāĻž āĻ•āϰāϤ⧇ * (āĻ…ā§āϝāĻžāĻ¸ā§āĻŸā§‡āϰāĻŋāĻ¸ā§āĻ•) āϚāĻŋāĻšā§āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

🔹 āϏāĻŋāύāĻŸā§āϝāĻžāĻ•ā§āϏ:

Go
var ptr *int  // āĻāĻ•āϟāĻŋ integer āĻāϰ āϜāĻ¨ā§āϝ pointer āĻ˜ā§‹āώāĻŖāĻž āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

āĻĄāĻŋāĻĢāĻ˛ā§āϟāĻ­āĻžāĻŦ⧇, āĻāĻ•āϟāĻŋ uninitialized pointer-āĻāϰ āĻŽāĻžāύ āĻšāϝāĻŧ nil, āĻ…āĻ°ā§āĻĨāĻžā§Ž āĻāϟāĻŋ āϕ⧋āύāĻ“ āĻŦ⧈āϧ āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰ⧇ āύāĻžāĨ¤

🔹 āωāĻĻāĻžāĻšāϰāĻŖ:

Go
package main

import "fmt"

func main() {
    var ptr *int  // Pointer āĻ˜ā§‹āώāĻŖāĻž āĻ•āϰāĻž āĻšāĻšā§āϛ⧇
    fmt.Println("Pointer āĻŽāĻžāύ:", ptr) // nil (āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻŽāĻžāύ)
}

🔹 āφāωāϟāĻĒ⧁āϟ:

Bash
Pointer āĻŽāĻžāύ: <nil>

2ī¸âƒŖ āĻ­ā§āϝāĻžāϰāĻŋāϝāĻŧ⧇āĻŦāϞ⧇āϰ āĻ āĻŋāĻ•āĻžāύāĻž āĻĒāĻžāĻ“āϝāĻŧāĻž (& āĻ…āĻĒāĻžāϰ⧇āϟāϰ)

Address-of āĻ…āĻĒāĻžāϰ⧇āϟāϰ (&) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϕ⧋āύ⧋ āĻ­ā§āϝāĻžāϰāĻŋāϝāĻŧ⧇āĻŦāϞ⧇āϰ āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻ āĻŋāĻ•āĻžāύāĻž āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧāĨ¤

🔹 āωāĻĻāĻžāĻšāϰāĻŖ:

Go
package main

import "fmt"

func main() {
    num := 42
    ptr := &num  // num-āĻāϰ āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻ āĻŋāĻ•āĻžāύāĻž āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāĻšā§āϛ⧇

    fmt.Println("num-āĻāϰ āĻŽāĻžāύ:", num)
    fmt.Println("num-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž:", ptr)  // Pointer āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻ āĻŋāĻ•āĻžāύāĻž āϧāϰ⧇ āϰāĻžāĻ–āϛ⧇
}

🔹 āφāωāϟāĻĒ⧁āϟ:

Bash
num-āĻāϰ āĻŽāĻžāύ: 42
num-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž: 0xc000014080  // (āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻ āĻŋāĻ•āĻžāύāĻž)

👉 &num num-āĻāϰ āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻ āĻŋāĻ•āĻžāύāĻž āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧ, āϝāĻž ptr-āĻ āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ āĻšāϝāĻŧāĨ¤

3ī¸âƒŖ Pointer Dereference āĻ•āϰāĻž (* āĻ…āĻĒāĻžāϰ⧇āϟāϰ)

Dereference āĻ…āĻĒāĻžāϰ⧇āϟāϰ (*) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ pointer-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ āĻĨāĻžāĻ•āĻž āĻŽāĻžāύāϟāĻŋ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧāĨ¤

🔹 āωāĻĻāĻžāĻšāϰāĻŖ:

Go
package main

import "fmt"

func main() {
    num := 42
    ptr := &num  // num-āĻāϰ Pointer

    fmt.Println("Pointer āĻ āĻŋāĻ•āĻžāύāĻž:", ptr)
    fmt.Println("Pointer-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ āĻĨāĻžāĻ•āĻž āĻŽāĻžāύ:", *ptr)  // Pointer dereference āĻ•āϰ⧇ āĻŽāĻžāύ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāĻšā§āϛ⧇
}

🔹 āφāωāϟāĻĒ⧁āϟ:

Bash
Pointer āĻ āĻŋāĻ•āĻžāύāĻž: 0xc000014080  // (āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻ āĻŋāĻ•āĻžāύāĻž)
Pointer-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ āĻĨāĻžāĻ•āĻž āĻŽāĻžāύ: 42

👉 *ptr Pointer dereference āĻ•āϰ⧇ āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ āĻĨāĻžāĻ•āĻž āφāϏāϞ āĻŽāĻžāύāϟāĻŋ āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧāĨ¤

4ī¸âƒŖ Pointer āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻŽāĻžāύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻž

Pointer āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŽā§‚āϞ āĻŽāĻžāύāϟāĻŋ dereference āĻ•āϰ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻž āϝāĻžāϝāĻŧāĨ¤

🔹 āωāĻĻāĻžāĻšāϰāĻŖ:

Go
package main

import "fmt"

func main() {
    num := 10
    ptr := &num  // num-āĻāϰ Pointer

    *ptr = 20  // Pointer āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻŽā§‚āϞ āĻŽāĻžāύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

    fmt.Println("āĻšāĻžāϞāύāĻžāĻ—āĻžāĻĻāĻ•ā§ƒāϤ num:", num)  // num-āĻāϰ āĻŽāĻžāύ āĻāĻ–āύ 20
}

🔹 āφāωāϟāĻĒ⧁āϟ:

Bash
āĻšāĻžāϞāύāĻžāĻ—āĻžāĻĻāĻ•ā§ƒāϤ num: 20

👉 āϝ⧇āĻšā§‡āϤ⧁ ptr num-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰāϛ⧇, āϤāĻžāχ *ptr āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϞ⧇ āĻŽā§‚āϞ āĻ­ā§āϝāĻžāϰāĻŋāϝāĻŧ⧇āĻŦāϞ num-āĻāϰ āĻŽāĻžāύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāĻŋāϤ āĻšāϝāĻŧāĨ¤

5ī¸âƒŖ Function-āĻ Pointer Pass āĻ•āϰāĻž (Pass by Reference)

Pointer function-āĻ pass āĻ•āϰāϞ⧇ āĻŽā§‚āϞ āĻ­ā§āϝāĻžāϰāĻŋāϝāĻŧ⧇āĻŦāϞāϟāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻž āϝāĻžāϝāĻŧ, āĻŽāĻžāύ⧇āϰ āĻ•āĻĒāĻŋ āύāϝāĻŧāĨ¤

🔹 āωāĻĻāĻžāĻšāϰāĻŖ:

Go
package main

import "fmt"

// Pointer āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŽāĻžāύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻžāϰ āĻĢāĻžāĻ‚āĻļāύ
func updateValue(ptr *int) {
    *ptr = *ptr + 5  // Dereference āĻ•āϰ⧇ āĻŽāĻžāύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇
}

func main() {
    num := 10
    updateValue(&num)  // num-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž pass āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

    fmt.Println("āĻšāĻžāϞāύāĻžāĻ—āĻžāĻĻāĻ•ā§ƒāϤ num:", num)  // num-āĻāϰ āĻŽāĻžāύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāĻŋāϤ āĻšāϝāĻŧ⧇āϛ⧇
}

🔹 āφāωāϟāĻĒ⧁āϟ:

Bash
āĻšāĻžāϞāύāĻžāĻ—āĻžāĻĻāĻ•ā§ƒāϤ num: 15

👉 āĻāĻ–āĻžāύ⧇, updateValue āĻāĻ•āϟāĻŋ Pointer āĻ—ā§āϰāĻšāĻŖ āĻ•āϰ⧇ āĻāĻŦāĻ‚ dereference āĻ•āϰ⧇ āĻŽā§‚āϞ āĻ­ā§āϝāĻžāϰāĻŋāϝāĻŧ⧇āĻŦāϞ⧇āϰ āĻŽāĻžāύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧇āĨ¤

6ī¸âƒŖ Pointer-āĻāϰ Pointer (Double Pointer)

āĻāĻ•āϟāĻŋ Pointer āφāϰ⧇āĻ•āϟāĻŋ Pointer-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž āϧāĻžāϰāĻŖ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

🔹 āωāĻĻāĻžāĻšāϰāĻŖ:

Go
package main

import "fmt"

func main() {
    num := 50
    ptr := &num   // num-āĻāϰ Pointer
    pptr := &ptr  // Pointer-āĻāϰ Pointer

    fmt.Println("num-āĻāϰ āĻŽāĻžāύ:", num)
    fmt.Println("num-āĻāϰ Pointer:", ptr)
    fmt.Println("Pointer-āĻāϰ Pointer:", pptr)
    fmt.Println("Double Pointer āĻĻāĻŋāϝāĻŧ⧇ āĻŽāĻžāύ:", **pptr)  // āĻĻ⧁āχāĻŦāĻžāϰ dereference āĻ•āϰ⧇ āĻŽā§‚āϞ āĻŽāĻžāύ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāĻšā§āϛ⧇
}

🔹 āφāωāϟāĻĒ⧁āϟ:

Bash
num-āĻāϰ āĻŽāĻžāύ: 50
num-āĻāϰ Pointer: 0xc000014080
Pointer-āĻāϰ Pointer: 0xc000006028
Double Pointer āĻĻāĻŋāϝāĻŧ⧇ āĻŽāĻžāύ: 50

👉 pptr ptr-āĻāϰ āĻ āĻŋāĻ•āĻžāύāĻž āϧāϰ⧇ āϰāĻžāϖ⧇, āĻāĻŦāĻ‚ **pptr dereference āĻ•āϰ⧇ āĻŽā§‚āϞ āĻŽāĻžāύāϟāĻŋ (num) āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧāĨ¤

7ī¸âƒŖ Struct-āĻāϰ āϏāĻžāĻĨ⧇ Pointer

Pointer-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ structs-āĻāϰ āĻĢāĻŋāĻ˛ā§āĻĄāϗ⧁āϞ⧋ āĻ•āĻžāĻ°ā§āϝāĻ•āϰāĻ­āĻžāĻŦ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻž āϝāĻžāϝāĻŧāĨ¤

🔹 āωāĻĻāĻžāĻšāϰāĻŖ:

Go
package main

import "fmt"

type Person struct {
    name string
    age  int
}

func updateAge(p *Person) {
    p.age = p.age + 1  // Pointer-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ struct āĻĢāĻŋāĻ˛ā§āĻĄ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇
}

func main() {
    p1 := Person{"Alice", 25}
    updateAge(&p1)  // struct-āĻāϰ Pointer pass āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

    fmt.Println("āĻšāĻžāϞāύāĻžāĻ—āĻžāĻĻāĻ•ā§ƒāϤ āĻŦāϝāĻŧāϏ:", p1.age)
}

🔹 āφāωāϟāĻĒ⧁āϟ:

Bash
āĻšāĻžāϞāύāĻžāĻ—āĻžāĻĻāĻ•ā§ƒāϤ āĻŦāϝāĻŧāϏ: 26

👉 āϝ⧇āĻšā§‡āϤ⧁ p Person-āĻāϰ Pointer, āϤāĻžāχ p.age āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϞ⧇ āĻŽā§‚āϞ struct p1-āĻāϰ age āĻĢāĻŋāĻ˛ā§āĻĄ āφāĻĒāĻĄā§‡āϟ āĻšāϝāĻŧāĨ¤

8ī¸âƒŖ Pointer-āĻāϰ āϜāĻ¨ā§āϝ new() vs. make() āĻŦā§āϝāĻŦāĻšāĻžāϰ

🔹 new() āĻŦā§āϝāĻŦāĻšāĻžāϰ

new() āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ­ā§āϝāĻžāϰāĻŋāϝāĻŧ⧇āĻŦāϞ⧇āϰ āϜāĻ¨ā§āϝ āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻŦāϰāĻžāĻĻā§āĻĻ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ Pointer āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧāĨ¤

Go
package main

import "fmt"

func main() {
    ptr := new(int)  // āĻāĻ•āϟāĻŋ integer-āĻāϰ āϜāĻ¨ā§āϝ āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻŦāϰāĻžāĻĻā§āĻĻ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇
    *ptr = 100
    fmt.Println("Pointer-āĻāϰ āĻŽāĻžāύ:", *ptr)
}

🔹 āφāωāϟāĻĒ⧁āϟ:

Bash
Pointer-āĻāϰ āĻŽāĻžāύ: 100

👉 new(int) āĻāĻ•āϟāĻŋ integer-āĻāϰ āϜāĻ¨ā§āϝ āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻŦāϰāĻžāĻĻā§āĻĻ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āϤāĻžāϰ Pointer āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧāĨ¤

🔹 make() āĻŦā§āϝāĻŦāĻšāĻžāϰ

make() slice, map āĻāĻŦāĻ‚ channel-āĻāϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧ āĻāĻŦāĻ‚ āĻāϗ⧁āϞ⧋āϕ⧇ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ•āĻ­āĻžāĻŦ⧇ initialize āĻ•āϰ⧇āĨ¤

Go
package main

import "fmt"

func main() {
    myMap := make(map[string]int)  // āĻāĻ•āϟāĻŋ map allocate āĻāĻŦāĻ‚ initialize āĻ•āϰāĻž āĻšāĻšā§āϛ⧇
    myMap["age"] = 30
    fmt.Println(myMap)
}

🔹 āφāωāϟāĻĒ⧁āϟ:

Bash
map[age:30]

👉 make() map (āĻŦāĻž slice/channel) initialize āĻ•āϰ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ new() āĻļ⧁āϧ⧁ āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻŦāϰāĻžāĻĻā§āĻĻ āĻ•āϰ⧇āĨ¤

9ī¸âƒŖ Nil Pointers āĻāĻŦāĻ‚ Dereferencing āĻ¤ā§āϰ⧁āϟāĻŋ āĻāĻĄāĻŧāĻžāύ⧋

Nil pointer āĻšāϞ⧋ āĻāĻ•āϟāĻŋ uninitialized pointer āĻāĻŦāĻ‚ āĻāϟāĻžāϕ⧇ dereference āĻ•āϰāϞ⧇ runtime āĻ¤ā§āϰ⧁āϟāĻŋ āϘāĻŸā§‡āĨ¤

🔹 āωāĻĻāĻžāĻšāϰāĻŖ:

Go
package main

import "fmt"

func main() {
    var ptr *int  // Nil pointer (uninitialized)
    
    if ptr == nil {
        fmt.Println("Pointer āϟāĻŋ nil, dereferencing āĻāĻĄāĻŧāĻžāύ⧋ āĻšāĻšā§āϛ⧇āĨ¤")
    } else {
        fmt.Println(*ptr)  // dereference āĻ•āϰāϞ⧇ āĻ¤ā§āϰ⧁āϟāĻŋ āϘāϟāĻŦ⧇
    }
}

🔹 āφāωāϟāĻĒ⧁āϟ:

Bash
Pointer āϟāĻŋ nil, dereferencing āĻāĻĄāĻŧāĻžāύ⧋ āĻšāĻšā§āϛ⧇āĨ¤

👉 Dereference āĻ•āϰāĻžāϰ āφāϗ⧇ pointer āϟāĻŋ nil āĻ•āĻŋāύāĻž āϤāĻž āϏāĻŦāϏāĻŽāϝāĻŧ āĻšā§‡āĻ• āĻ•āϰāĻž āωāϚāĻŋāϤ runtime āĻ¤ā§āϰ⧁āϟāĻŋ āĻāĻĄāĻŧāĻžāϤ⧇āĨ¤

āĻāĻ­āĻžāĻŦ⧇āχ Pointers āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āφāĻŽāϰāĻž āĻ•āĻžāĻ°ā§āϝāĻ•āϰāĻ­āĻžāĻŦ⧇ āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ āĻāĻŦāĻ‚ āĻŽā§‚āϞ āĻ­ā§āϝāĻžāϰāĻŋāϝāĻŧ⧇āĻŦāϞāϗ⧁āϞ⧋āϕ⧇ āϏāϰāĻžāϏāϰāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ! 🚀

Š2025 Linux Bangla | Developed & Maintaind by Linux Bangla.