Pointer in Go
Understanding pointers in Go programming language with examples.
Mar 23, 2025•Fahimul Islam•2 min
পয়েন্টার (Pointer) হচ্ছে এমন একটি ভেরিয়েবল, যা অন্য একটি ভেরিয়েবলের মেমরি এড্রেস ধরে রাখে। সহজ ভাষায়, এটি মেমরির রেফারেন্স রাখে এবং এর মাধ্যমে মূল ডাটা নিয়ে কাজ করা যায়।
পয়েন্টার কেন দরকার?
✅ মেমরি অপটিমাইজেশন: বড় ডাটা কপি না করে সরাসরি ব্যবহার করা যায়।
✅ মূল ভেরিয়েবলের মান পরিবর্তন: পয়েন্টার ব্যবহার করে ফাংশনের মধ্যে ভেরিয়েবল পরিবর্তন করা যায়।
✅ ডাটা স্ট্রাকচারের পারফরম্যান্স বাড়ানো: বড় স্ট্রাক্ট বা অবজেক্ট পাস করার ক্ষেত্রে পয়েন্টার ব্যবহার করাই ভালো।
Go-তে পয়েন্টার কিভাবে কাজ করে?
Go-তে পয়েন্টার ব্যবহার করতে হলে & (address-of) অপারেটর এবং * (dereference) অপারেটর বুঝতে হবে।
পয়েন্টার তৈরি ও ডিরেফারেন্স করা
1package main
2import "fmt"
3func main() {
4 a := 42 // সাধারণ ভেরিয়েবল
5 p := &a // a-এর মেমরির ঠিকানা ধরে রাখা
6 fmt.Println("a এর মান:", a)
7 fmt.Println("a এর ঠিকানা:", p)
8 fmt.Println("p দ্বারা a এর মান:", *p) // ডিরেফারেন্স করে মূল মান পাওয়া
9}
1package main
2import "fmt"
3func main() {
4 a := 42 // সাধারণ ভেরিয়েবল
5 p := &a // a-এর মেমরির ঠিকানা ধরে রাখা
6 fmt.Println("a এর মান:", a)
7 fmt.Println("a এর ঠিকানা:", p)
8 fmt.Println("p দ্বারা a এর মান:", *p) // ডিরেফারেন্স করে মূল মান পাওয়া
9}
পয়েন্টার ব্যবহার করে মান পরিবর্তন করা
1package main
2import "fmt"
3func main() {
4 x := 10
5 p := &x
6 fmt.Println("আগের মান:", x) // 10
7 *p = 50
8 fmt.Println("পরিবর্তিত মান:", x) // 50
9}
1package main
2import "fmt"
3func main() {
4 x := 10
5 p := &x
6 fmt.Println("আগের মান:", x) // 10
7 *p = 50
8 fmt.Println("পরিবর্তিত মান:", x) // 50
9}
ফাংশনে পয়েন্টার পাস করে ভ্যারিয়েবলের মান পরিবর্তন
ফাংশনে সাধারণত ভেরিয়েবল পাস করলে তার একটি কপি যায়(pass by value)। কিন্তু পয়েন্টার পাস করলে সেটির মেমরি এড্রেস রেফার করে(pass by reference), তাই original ভ্যারিয়েবল পরিবর্তন হয়।
1package main
2import "fmt"
3func updateValue(x *int) {
4 *x = 100
5}
6func main() {
7 num := 25
8 fmt.Println("আগে:", num) // 25
9 updateValue(&num)
10 fmt.Println("পরে:", num) // 100
11}
1package main
2import "fmt"
3func updateValue(x *int) {
4 *x = 100
5}
6func main() {
7 num := 25
8 fmt.Println("আগে:", num) // 25
9 updateValue(&num)
10 fmt.Println("পরে:", num) // 100
11}
Struct ও পয়েন্টার
অনেক বড় Struct ব্যবহার করলে পয়েন্টার দিয়ে রেফারেন্স পাঠানো ভালো, এতে মেমরি কম খরচ হয়। Go স্বয়ংক্রিয়ভাবে Struct Pointer ডিরেফারেন্স করে, তাই p.name বা p.age সরাসরি ব্যবহার করা যায়।
1package main
2import "fmt"
3type Person struct {
4 name string
5 age int
6}
7func main() {
8 p := &Person{name: "Alice", age: 30}
9 fmt.Println("আগে:", p.age) // 30
10 p.age = 35 // এখানে Go নিজে থেকেই *p.age কে p.age হিসেবে ধরবে
11 fmt.Println("পরে:", p.age) // 35
12}
1package main
2import "fmt"
3type Person struct {
4 name string
5 age int
6}
7func main() {
8 p := &Person{name: "Alice", age: 30}
9 fmt.Println("আগে:", p.age) // 30
10 p.age = 35 // এখানে Go নিজে থেকেই *p.age কে p.age হিসেবে ধরবে
11 fmt.Println("পরে:", p.age) // 35
12}
❗ বিঃদ্রঃ: যদি *p.age লিখে ডিরেফারেন্স করার চেষ্টা করা হয়, তাহলে এটি কাজ করবে না কারণ p.age নিজেই Go দ্বারা ডিরেফারেন্স হয়ে যায়।
Nil Pointer চেক করা
যদি কোনো পয়েন্টার কোনো এড্রেস নির্দেশ না করে, তাহলে তার মান nil থাকে। এক্ষেত্রে পয়েন্টার ব্যবহার করার আগে চেক করে নিতে পারেন।
1package main
2import "fmt"
3func main() {
4 var p *int
5 if p == nil {
6 fmt.Println("Pointer is nil")
7 }
8}
1package main
2import "fmt"
3func main() {
4 var p *int
5 if p == nil {
6 fmt.Println("Pointer is nil")
7 }
8}
পয়েন্টার দিয়ে অ্যারে ও স্লাইস মডিফাই করা
1package main
2import "fmt"
3func updateArray(arr *[]int) {
4 (*arr)[0] = 99
5}
6func main() {
7 nums := []int{1, 2, 3}
8 fmt.Println("আগে:", nums) // [1 2 3]
9 updateArray(&nums)
10 fmt.Println("পরে:", nums) // [99 2 3]
11}
1package main
2import "fmt"
3func updateArray(arr *[]int) {
4 (*arr)[0] = 99
5}
6func main() {
7 nums := []int{1, 2, 3}
8 fmt.Println("আগে:", nums) // [1 2 3]
9 updateArray(&nums)
10 fmt.Println("পরে:", nums) // [99 2 3]
11}
উপসংহার
Go-তে পয়েন্টার একটি অত্যন্ত গুরুত্বপূর্ণ কনসেপ্ট, বিশেষ করে মেমরি ম্যানেজমেন্ট, বড় ডাটা হ্যান্ডলিং এবং ফাংশনের মাধ্যমে ডাটা পরিবর্তন করার ক্ষেত্রে।
& দিয়ে মেমরি এড্রেস পাওয়া যায়।
* দিয়ে সেই এড্রেসের ডাটা এক্সেস করা যায়।
- ফাংশনে পয়েন্টার পাস করলে মূল ডাটা পরিবর্তন করা সম্ভব।
- বড় Struct বা স্লাইস পাস করতে গেলে পয়েন্টার ব্যবহার করাই ভালো।
- Go Struct Pointer-কে স্বয়ংক্রিয়ভাবে ডিরেফারেন্স করে, তাই
p.name বা p.age সরাসরি ব্যবহার করা যায়।
পয়েন্টার নিয়ে আরও বিস্তারিত জানার জন্য অফিসিয়াল Go ডকুমেন্টেশন পড়তে পারেন। Happy Coding! 🚀