A Simple Guide to Pointers in Golang

Fahimul IslamFahimul Islam
3 min read

পয়েন্টার (Pointer) হচ্ছে এমন একটি ভেরিয়েবল, যা অন্য একটি ভেরিয়েবলের মেমরি এড্রেস ধরে রাখে। সহজ ভাষায়, এটি মেমরির রেফারেন্স রাখে এবং এর মাধ্যমে মূল ডাটা নিয়ে কাজ করা যায়।

পয়েন্টার কেন দরকার?

  1. মেমরি অপটিমাইজেশন: অনেক বড় ডাটা কপি না করে সরাসরি ব্যবহার করা যায়।

  2. মূল ভেরিয়েবলের মান পরিবর্তন: পয়েন্টার ব্যবহার করে ফাংশনের মধ্যে ভেরিয়েবল পরিবর্তন করা যায়।

  3. ডাটা স্ট্রাকচারের পারফরম্যান্স বাড়ানো: অনেক বড় struct বা অবজেক্ট পাস করার সময় পয়েন্টার ব্যবহার করা উচিত।

Go-তে পয়েন্টার কিভাবে কাজ করে?

Go-তে পয়েন্টার ব্যবহার করতে হলে & (address-of) অপারেটর এবং * (dereference) অপারেটর বুঝতে হবে।

পয়েন্টার তৈরি ও ডিরেফারেন্স করা

package main
import "fmt"
func main() {
    a := 42 // সাধারণ ভেরিয়েবল
    p := &a // a-এর মেমরির ঠিকানা ধরে রাখা
    fmt.Println("a এর মান:", a)
    fmt.Println("a এর ঠিকানা:", p)
    fmt.Println("p দ্বারা a এর মান:", *p) // ডিরেফারেন্স করে মূল মান পাওয়া
}

পয়েন্টার ব্যবহার করে মান পরিবর্তন করা

package main
import "fmt"
func main() {
    x := 10
    p := &x
    fmt.Println("আগের মান:", x) // 10
    *p = 50
    fmt.Println("পরিবর্তিত মান:", x) // 50
}

পয়েন্টার পাস করে ফাংশনে মান পরিবর্তন

ফাংশনে সাধারণত ভেরিয়েবল পাস করলে তার একটি কপি যায়। কিন্তু পয়েন্টার পাস করলে সেটির মেমরি এড্রেস রেফার করে, তাই আসল ডাটাই পরিবর্তন হয়।

package main
import "fmt"
func updateValue(x *int) {
    *x = 100
}
func main() {
    num := 25
    fmt.Println("আগে:", num) // 25
    updateValue(&num)
    fmt.Println("পরে:", num) // 100
}

Struct ও পয়েন্টার

অনেক বড় Struct ব্যবহার করলে পয়েন্টার দিয়ে রেফারেন্স পাঠানো ভালো, এতে মেমরি কম খরচ হয়। Go স্বয়ংক্রিয়ভাবে Struct Pointer ডিরেফারেন্স করে, তাই p.name বা p.age সরাসরি ব্যবহার করা যায়।

package main
import "fmt"
type Person struct {
    name string
    age  int
}
func main() {
    p := &Person{name: "Alice", age: 30}
    fmt.Println("আগে:", p.age) // 30
    p.age = 35 // এখানে Go নিজে থেকেই *p.age কে p.age হিসেবে ধরবে
    fmt.Println("পরে:", p.age) // 35
}

বিঃদ্রঃ: যদি *p.age লিখে ডিরেফারেন্স করার চেষ্টা করা হয়, তাহলে এটি কাজ করবে না কারণ p.age নিজেই Go দ্বারা ডিরেফারেন্স হয়ে যায়। আপনি চাইলে (*p).age ব্যবহার করতে পারেন। কিন্তু *p.age লিখলে error খাবেন।

Nil Pointer চেক করা

যদি কোনো পয়েন্টার কোনো এড্রেস নির্দেশ না করে, তাহলে তার মান nil থাকে। এক্ষেত্রে পয়েন্টার ব্যবহার করার আগে চেক করে নিতে পারেন।

package main
import "fmt"
func main() {
    var p *int
    if p == nil {
        fmt.Println("Pointer is nil")
    }
}

পয়েন্টার দিয়ে অ্যারে ও স্লাইস মডিফাই করা

package main
import "fmt"
func updateArray(arr *[]int) {
    (*arr)[0] = 99
}
func main() {
    nums := []int{1, 2, 3}
    fmt.Println("আগে:", nums) // [1 2 3]
    updateArray(&nums)
    fmt.Println("পরে:", nums) // [99 2 3]
}

উপসংহার

Go-তে পয়েন্টার একটি অত্যন্ত গুরুত্বপূর্ণ কনসেপ্ট, বিশেষ করে মেমরি ম্যানেজমেন্ট, বিগ ডাটা হ্যান্ডলিং এবং ফাংশনের মাধ্যমে ডাটা পরিবর্তন করার ক্ষেত্রে।

  • & দিয়ে মেমরি এড্রেস পাওয়া যায়।

  • * দিয়ে সেই এড্রেসের ডাটা এক্সেস করা যায়।

  • ফাংশনে পয়েন্টার পাস করলে মূল ডাটা পরিবর্তন করা সম্ভব।

  • বড় Struct বা স্লাইস পাস করতে গেলে পয়েন্টার ব্যবহার করাই ভালো।

  • Go Struct Pointer-কে স্বয়ংক্রিয়ভাবে ডিরেফারেন্স করে, তাই p.name বা p.age সরাসরি ব্যবহার করা যায়।

পয়েন্টার নিয়ে আরও বিস্তারিত জানার জন্য অফিসিয়াল Go ডকুমেন্টেশন পড়তে পারেন। Happy Coding! 🚀


0
Subscribe to my newsletter

Read articles from Fahimul Islam directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Fahimul Islam
Fahimul Islam

Hey, I'm a fresh CS graduate from a public university from Bangladesh named BSMRSTU. I love to write code in Javascript and Go.