Control Flow Statements (নিয়ন্ত্রণ প্রবাহ স্টেটমেন্টস)
Go প্রোগ্রামিং ভাষায় নিয়ন্ত্রণ প্রবাহ স্টেটমেন্টস প্রোগ্রামের কার্যক্রমের প্রবাহ নির্ধারণ করে, যেমন কোন কোডের অংশ কখন কার্যকরী হবে। এগুলি কোডের নির্দিষ্ট অংশে শর্ত অনুযায়ী সিদ্ধান্ত নেয়ার সুযোগ দেয়। Go ভাষায় মূলত if, else, switch, এবং for লুপ কন্ট্রোল স্টেটমেন্ট হিসেবে ব্যবহৃত হয়।
১. If Statement (If স্টেটমেন্ট)
If স্টেটমেন্ট একটি শর্ত পূরণের ভিত্তিতে কোড এক্সিকিউট করার জন্য ব্যবহৃত হয়। Go-তে if স্টেটমেন্টের সাথে কোন else বা else if ব্যবহৃত হতে পারে।
সিনট্যাক্স:
if condition {
// code to be executed if condition is true
}উদাহরণ:
package main
import "fmt"
func main() {
age := 18
if age >= 18 {
fmt.Println("You are an adult.")
}
}এখানে, যদি age ১৮ বা তার বেশি হয়, তাহলে "You are an adult." আউটপুট দেখাবে।
Else if এবং Else
আপনি একাধিক শর্তের জন্য else if এবং else ব্যবহার করতে পারেন:
package main
import "fmt"
func main() {
age := 16
if age >= 18 {
fmt.Println("You are an adult.")
} else if age >= 13 {
fmt.Println("You are a teenager.")
} else {
fmt.Println("You are a child.")
}
}এখানে, ১৬ বছর বয়সে "You are a teenager." আউটপুট হবে।
২. Switch Statement (Switch স্টেটমেন্ট)
Switch স্টেটমেন্ট একাধিক শর্তের মধ্যে কোন একটি মিলে গেলে কোডের একটি নির্দিষ্ট অংশ চালানোর জন্য ব্যবহৃত হয়। এটি একাধিক if-else চেইনের থেকে বেশি পরিষ্কার এবং সহজ।
সিনট্যাক্স:
switch expression {
case value1:
// code to be executed if expression == value1
case value2:
// code to be executed if expression == value2
default:
// code to be executed if no case matches
}উদাহরণ:
package main
import "fmt"
func main() {
day := 3
switch day {
case 1:
fmt.Println("Monday")
case 2:
fmt.Println("Tuesday")
case 3:
fmt.Println("Wednesday")
case 4:
fmt.Println("Thursday")
case 5:
fmt.Println("Friday")
case 6:
fmt.Println("Saturday")
case 7:
fmt.Println("Sunday")
default:
fmt.Println("Invalid day")
}
}এখানে, day এর মান ৩ হওয়ায় "Wednesday" আউটপুট হবে।
২.১ Switch without Expression (এক্সপ্রেশন ছাড়া Switch)
Go-তে আপনি switch স্টেটমেন্টে কোন এক্সপ্রেশন ছাড়াও সরাসরি শর্ত দিতে পারেন, যা if-else চেইনের মতো কাজ করে।
package main
import "fmt"
func main() {
age := 25
switch {
case age >= 18:
fmt.Println("You are an adult.")
case age < 18:
fmt.Println("You are a minor.")
}
}এখানে, age ১৮ বা তার বেশি হলে "You are an adult." আউটপুট হবে।
৩. For Loop (For লুপ)
For লুপ Go ভাষার একমাত্র লুপ স্টেটমেন্ট, যা বিভিন্ন রূপে ব্যবহৃত হতে পারে। এটি একটি শর্ত পূরণ না হওয়া পর্যন্ত কোড পুনরায় এক্সিকিউট করতে সাহায্য করে।
সিনট্যাক্স:
for initialization; condition; post {
// code to be executed
}উদাহরণ ১: সাধারন for লুপ
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
fmt.Println(i)
}
}এখানে, i এর মান ০ থেকে ৪ পর্যন্ত আউটপুট হবে।
উদাহরণ ২: ইনফিনিট লুপ
Go-তে for লুপ দিয়ে ইনফিনিট লুপও তৈরি করা যায়, যেখানে শর্তের অভাব থাকে।
package main
import "fmt"
func main() {
for {
fmt.Println("This loop will run forever!")
}
}এটি একেবারে শেষ না হওয়া পর্যন্ত চলবে।
উদাহরণ ৩: for লুপে range ব্যবহার
range ব্যবহার করে স্লাইস, অ্যারে, অথবা চ্যানেল এর উপর লুপ করা যায়।
package main
import "fmt"
func main() {
fruits := []string{"Apple", "Banana", "Cherry"}
for index, fruit := range fruits {
fmt.Println(index, fruit)
}
}এখানে, স্লাইসের প্রতিটি উপাদান এবং এর ইনডেক্স আউটপুট হবে।
৪. Break Statement (Break স্টেটমেন্ট)
Break স্টেটমেন্ট একটি লুপ অথবা সুইচ ব্লক থেকে বাহির হতে ব্যবহৃত হয়। এটি লুপ বা সুইচের কার্যক্রম থামিয়ে দেয়।
উদাহরণ:
package main
import "fmt"
func main() {
for i := 0; i < 10; i++ {
if i == 5 {
break
}
fmt.Println(i)
}
}এখানে, i যখন ৫ হয়, তখন লুপটি থেমে যাবে এবং আউটপুট হবে: 0, 1, 2, 3, 4
৫. Continue Statement (Continue স্টেটমেন্ট)
Continue স্টেটমেন্ট বর্তমান ইটারেশনটি বাদ দিয়ে পরবর্তী ইটারেশনে চলে যায়। এটি লুপের মধ্যবর্তী অংশকে এড়িয়ে চলে।
উদাহরণ:
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
if i == 3 {
continue
}
fmt.Println(i)
}
}এখানে, i যখন ৩ হয়, তখন continue এর কারণে লুপ পরবর্তী ইটারেশনে চলে যাবে এবং আউটপুট হবে: 0, 1, 2, 4
সারসংক্ষেপ
- If স্টেটমেন্ট শর্তানুযায়ী কোড এক্সিকিউট করে।
- Switch স্টেটমেন্ট একাধিক শর্তের মধ্যে একটি নির্বাচন করে কোড এক্সিকিউট করে।
- For লুপ ব্যবহৃত হয় নির্দিষ্ট সংখ্যক বা শর্ত পূর্ণ না হওয়া পর্যন্ত কোড পুনরায় এক্সিকিউট করার জন্য।
- Break এবং Continue লুপের কার্যক্রম নিয়ন্ত্রণ করতে সাহায্য করে।
এই নিয়ন্ত্রণ প্রবাহ স্টেটমেন্টগুলি প্রোগ্রামিংয়ের গুরুত্বপূর্ণ অংশ, যা কোডের লজিক এবং কার্যক্রম নিয়ন্ত্রণ করতে সহায়ক।
if, else, এবং switch স্টেটমেন্ট
Go প্রোগ্রামিং ভাষায় কন্ট্রোল ফ্লো পরিচালনার জন্য প্রধানত if, else, এবং switch স্টেটমেন্ট ব্যবহার করা হয়। এগুলি কোডের শাখা তৈরি করতে সহায়ক, যাতে নির্দিষ্ট শর্তের উপর ভিত্তি করে কোড এক্সিকিউট হয়। নিচে প্রতিটি স্টেটমেন্টের ব্যবহার এবং উদাহরণ দেওয়া হলো।
১. if স্টেটমেন্ট
if স্টেটমেন্ট শর্তের ভিত্তিতে এক্সিকিউশন নিয়ন্ত্রণ করে। এটি একটি শর্ত পরীক্ষা করে এবং শর্তটি সত্য (true) হলে নির্দিষ্ট ব্লক কোড চালায়।
সাধারণ সিনট্যাক্স:
if condition {
// কোড যা শর্ত সত্য হলে চলবে
}উদাহরণ:
package main
import "fmt"
func main() {
x := 10
if x > 5 {
fmt.Println("x is greater than 5")
}
}আউটপুট:
x is greater than 5উল্লেখযোগ্য বিষয়:
- Go তে
ifস্টেটমেন্টে কোনো অ্যাক্সিডেন্টাল ব্রেসেস (parantheses) ব্যবহার করতে হয় না, অর্থাৎif (condition)এর মতো নয়, সরাসরিif conditionলেখা হয়।
২. else স্টেটমেন্ট
else স্টেটমেন্টটি একটি বিকল্প শর্ত নির্ধারণ করে যা তখন কার্যকর হয় যখন if শর্ত মিথ্যা (false) হয়। এটি if ব্লকের পরেই লেখা হয়।
সাধারণ সিনট্যাক্স:
if condition {
// কোড যা শর্ত সত্য হলে চলবে
} else {
// কোড যা শর্ত মিথ্যা হলে চলবে
}উদাহরণ:
package main
import "fmt"
func main() {
x := 3
if x > 5 {
fmt.Println("x is greater than 5")
} else {
fmt.Println("x is not greater than 5")
}
}আউটপুট:
x is not greater than 5উল্লেখযোগ্য বিষয়:
elseব্লকটি ঐ কোডের জন্য লেখা হয় যেগুলো শর্ত মিথ্যা (false) হলে কার্যকর হয়।
৩. else if স্টেটমেন্ট
একাধিক শর্ত পরীক্ষা করতে else if ব্যবহার করা হয়। যখন একাধিক শর্ত পরীক্ষা করা প্রয়োজন, তখন if-else স্ট্রাকচারকে আরও বিস্তারিত করার জন্য else if ব্যবহার করা হয়।
সাধারণ সিনট্যাক্স:
if condition1 {
// কোড যা শর্ত ১ সত্য হলে চলবে
} else if condition2 {
// কোড যা শর্ত ২ সত্য হলে চলবে
} else {
// কোড যা কোনো শর্তই সত্য না হলে চলবে
}উদাহরণ:
package main
import "fmt"
func main() {
x := 10
if x > 15 {
fmt.Println("x is greater than 15")
} else if x > 5 {
fmt.Println("x is greater than 5 but less than or equal to 15")
} else {
fmt.Println("x is less than or equal to 5")
}
}আউটপুট:
x is greater than 5 but less than or equal to 15৪. switch স্টেটমেন্ট
switch স্টেটমেন্টের মাধ্যমে একাধিক শর্ত পরীক্ষা করা যায় এবং শর্তের ভিত্তিতে একাধিক কোড ব্লক চালানো যায়। এটি if-else if স্ট্রাকচারের চেয়ে সহজ এবং পরিষ্কার কোড প্রদান করে।
সাধারণ সিনট্যাক্স:
switch expression {
case value1:
// কোড যা value1 এর জন্য চলবে
case value2:
// কোড যা value2 এর জন্য চলবে
default:
// কোড যা কোন match না হলে চলবে
}উদাহরণ:
package main
import "fmt"
func main() {
x := 2
switch x {
case 1:
fmt.Println("x is 1")
case 2:
fmt.Println("x is 2")
case 3:
fmt.Println("x is 3")
default:
fmt.Println("x is not 1, 2, or 3")
}
}আউটপুট:
x is 2উল্লেখযোগ্য বিষয়:
switchস্টেটমেন্টে প্রতিটিcaseএকটি মানের সাথে মিলিয়ে পরীক্ষা করা হয়।defaultহলো ঐ স্টেটমেন্ট যা কোনোcaseএর সাথে মেলেনি এমন পরিস্থিতিতে কার্যকর হয়।- Go-তে
switchস্টেটমেন্টে সাধারণতbreakব্যবহার করতে হয় না, কারণcaseব্লক শেষ হওয়ার পর স্বয়ংক্রিয়ভাবেswitchথেকে বেরিয়ে যায়।
আরও একটি উদাহরণ:
package main
import "fmt"
func main() {
day := "Tuesday"
switch day {
case "Monday":
fmt.Println("Start of the week")
case "Tuesday":
fmt.Println("Second day of the week")
case "Wednesday":
fmt.Println("Middle of the week")
case "Thursday", "Friday":
fmt.Println("Almost weekend")
default:
fmt.Println("Invalid day")
}
}আউটপুট:
Second day of the weekউল্লেখযোগ্য বিষয়:
caseগুলোর মধ্যে একাধিক মান দিয়ে একসাথে লিখতে পারেন, যেমনcase "Thursday", "Friday":।
সারসংক্ষেপ
if: একটি শর্ত পরীক্ষা করে এবং শর্ত সত্য হলে নির্দিষ্ট ব্লক কোড চালায়।else:ifশর্ত মিথ্যা হলে বিকল্প কোড চালায়।else if: একাধিক শর্ত পরীক্ষা করে, যখন একাধিক শর্ত নির্ধারণ করতে হয়।switch: একাধিক শর্তের মধ্যে যে শর্ত মিলে তা নির্বাচন করে এবং নির্দিষ্ট কোড ব্লক চালায়।
if, else, এবং switch স্টেটমেন্টগুলির মাধ্যমে আপনি কোডের কার্যকলাপ নিয়ন্ত্রণ করতে পারেন, এবং এটি আপনাকে আরও শক্তিশালী এবং জটিল লজিক্যাল চেক তৈরি করতে সহায়ক।
Looping: for লুপের ব্যবহার
Go প্রোগ্রামিং ভাষায় for লুপ হল একমাত্র লুপ স্টেটমেন্ট যা ব্যবহার করা হয়। অন্যান্য ভাষায় যেমন while বা do-while লুপ থাকে, Go ভাষায় সেগুলোর কোনো অস্তিত্ব নেই। তবে, Go-তে for লুপের বিভিন্ন ধরনের ব্যবহার রয়েছে যা বিভিন্ন ধরনের লুপিং কার্যক্রম সম্পাদন করতে সক্ষম।
সাধারণ সিনট্যাক্স:
for condition {
// statements
}এখানে condition হলো একটি শর্ত যা সঠিক হলে লুপ চলবে। শর্তটি true হলে লুপ চলতে থাকবে এবং যদি false হয় তবে লুপ বন্ধ হয়ে যাবে।
for লুপের ব্যবহার এবং উদাহরণ
সাধারণ
forলুপ:
এই ধরনের লুপে একটি শুরু, শর্ত এবং একটি ইনক্রিমেন্ট/ডিক্রিমেন্ট অপারেশন থাকে।উদাহরণ:
for i := 0; i < 5; i++ { fmt.Println(i) }আউটপুট:
0 1 2 3 4এখানে, লুপটি ০ থেকে ৪ পর্যন্ত চলবে, কারণ
iএর মান5এর চেয়ে ছোট থাকলে লুপ চলতে থাকবে এবং প্রতি পুনরাবৃত্তিতেiএর মান এক বাড়ানো হবে (i++দ্বারা)।
শুধুমাত্র শর্ত সহ
forলুপ:
আপনি যদি শর্ত দিয়ে লুপ চালাতে চান এবং ইনক্রিমেন্ট/ডিক্রিমেন্টের জন্য কোনো অ্যাসাইনমেন্ট বা স্টেটমেন্ট দিতে না চান, তবে আপনি শুধু শর্ত দিয়েই লুপ তৈরি করতে পারেন।উদাহরণ:
i := 0 for i < 5 { fmt.Println(i) i++ }আউটপুট:
0 1 2 3 4এখানে, শর্তটি
i < 5হওয়া পর্যন্ত লুপ চলবে, এবং প্রতিবারi++দ্বারা মান বাড়ানো হবে।
forলুপের অনন্ত লুপ (infinite loop):
যদি আপনি কোনও শর্ত না দিয়ে একটি অনন্ত লুপ তৈরি করতে চান, তবে আপনি শুধুমাত্রforলিখে ফেলতে পারেন, এবং এটি অনন্তকাল চলবে যতক্ষণ না আপনি এটি বাধাগ্রস্ত করেন (যেমনbreakব্যবহার করে)।উদাহরণ:
for { fmt.Println("This is an infinite loop") break }আউটপুট:
This is an infinite loopএখানে, লুপটি শুধুমাত্র একবার চলবে কারণ
breakস্টেটমেন্টটি লুপ থেকে বেরিয়ে আসবে।
forলুপেcontinueস্টেটমেন্ট ব্যবহার:continueস্টেটমেন্টটি লুপের বর্তমান পুনরাবৃত্তি বন্ধ করে এবং পরবর্তী পুনরাবৃত্তিতে চলে যায়।উদাহরণ:
for i := 0; i < 5; i++ { if i == 2 { continue } fmt.Println(i) }আউটপুট:
0 1 3 4এখানে, যখন
iএর মান2হয়, তখনcontinueস্টেটমেন্টটিfmt.Println(i)স্টেটমেন্টটি অগ্রাহ্য করে পরবর্তী পুনরাবৃত্তিতে চলে যাবে।
forলুপেbreakস্টেটমেন্ট ব্যবহার:breakস্টেটমেন্টটি লুপের চলমান অবস্থান থেকে বেরিয়ে আসে এবং লুপটি বন্ধ করে দেয়।উদাহরণ:
for i := 0; i < 5; i++ { if i == 3 { break } fmt.Println(i) }আউটপুট:
0 1 2এখানে, যখন
iএর মান3হয়, তখনbreakস্টেটমেন্টটি লুপ বন্ধ করে দেবে এবং লুপের বাইরে চলে যাবে।
সারসংক্ষেপ
Go প্রোগ্রামিং ভাষায় for লুপ খুবই গুরুত্বপূর্ণ এবং এটি লুপিং কার্যক্রম সম্পাদন করতে ব্যবহৃত হয়। এটি একাধিক ভাবে ব্যবহার করা যেতে পারে:
- সাধারণ
forলুপ: শুরু, শর্ত এবং ইনক্রিমেন্ট/ডিক্রিমেন্ট সহ। - শর্ত সহ
forলুপ: শুধুমাত্র শর্ত ব্যবহার করে লুপ চালানো। - অনন্ত লুপ: কোনও শর্ত না দিয়ে একটি অনন্ত লুপ তৈরি করা।
continueস্টেটমেন্ট: লুপের বর্তমান পুনরাবৃত্তি বাদ দিয়ে পরবর্তী পুনরাবৃত্তি চালানো।breakস্টেটমেন্ট: লুপ থেকে বেরিয়ে আসা।
for লুপ ব্যবহার করে বিভিন্ন ধরনের লজিক এবং কাজ সম্পাদন করা যায়, যা প্রোগ্রামিংয়ে খুবই গুরুত্বপূর্ণ।
Go-তে break, continue, এবং goto স্টেটমেন্ট
Go প্রোগ্রামিং ভাষায়, break, continue, এবং goto স্টেটমেন্টগুলি লুপের প্রবাহ নিয়ন্ত্রণ করতে ব্যবহৃত হয়। এই স্টেটমেন্টগুলি সাধারণত লুপ এবং কন্ডিশনাল স্টেটমেন্টের মধ্যে প্রবাহ নিয়ন্ত্রণ করার জন্য ব্যবহৃত হয়, যাতে নির্দিষ্ট কিছু শর্তে লুপ বা কোড ব্লক থামানো বা চালানো যায়।
১. break স্টেটমেন্ট
break স্টেটমেন্টটি লুপ (যেমন for, switch, বা select) বা কন্ডিশনাল স্টেটমেন্টের মধ্যে প্রবাহ বন্ধ করার জন্য ব্যবহৃত হয়। এটি ব্যবহার করে আপনি লুপটি তৎক্ষণাৎ থামিয়ে দিতে পারেন, যদি কোন শর্ত পূর্ণ হয়।
১.১ break উদাহরণ
package main
import "fmt"
func main() {
for i := 1; i <= 10; i++ {
if i == 5 {
break // যখন i 5 হবে, তখন লুপ থামিয়ে দেবে
}
fmt.Println(i)
}
}এখানে, লুপটি ১ থেকে ৪ পর্যন্ত চলবে এবং যখন i == 5 হবে, তখন break স্টেটমেন্ট চালু হবে এবং লুপটি তৎক্ষণাৎ থামিয়ে দেওয়া হবে। আউটপুট হবে:
1
2
3
4২. continue স্টেটমেন্ট
continue স্টেটমেন্টটি বর্তমান ইটারেশনটি বাদ দিয়ে লুপের পরবর্তী ইটারেশনে চলে যায়। এটি লুপের বর্তমান চক্রে (iteration) কিছু শর্ত পূর্ণ হলে বাকি অংশ বাদ দিয়ে পরবর্তী চক্রে চলে যেতে ব্যবহৃত হয়।
২.১ continue উদাহরণ
package main
import "fmt"
func main() {
for i := 1; i <= 10; i++ {
if i == 5 {
continue // যখন i 5 হবে, তখন বাকি অংশ স্কিপ করে পরবর্তী ইটারেশনে চলে যাবে
}
fmt.Println(i)
}
}এখানে, i == 5 হলে continue স্টেটমেন্টটি চালু হবে এবং i == 5 অবস্থায় fmt.Println(i) কল হবে না, অর্থাৎ ৫ স্কিপ করা হবে। আউটপুট হবে:
1
2
3
4
6
7
8
9
10৩. goto স্টেটমেন্ট
goto স্টেটমেন্টটি কোডের মধ্যে নির্দিষ্ট লেবেলে (label) চলে যাওয়ার জন্য ব্যবহৃত হয়। এটি কোডের মধ্যে লেবেল তৈরি করে এবং সেই লেবেলে যাওয়ার নির্দেশ দেয়, যা সাধারণত কোডে প্রবাহ নিয়ন্ত্রণের জন্য ব্যবহৃত হয়।
৩.১ goto উদাহরণ
package main
import "fmt"
func main() {
i := 0
Loop:
fmt.Println(i)
i++
if i < 5 {
goto Loop // যখন i 5 এর কম হবে, তখন Loop লেবেলে ফিরে যাবে
}
fmt.Println("Loop Ended")
}এখানে, goto স্টেটমেন্টটি Loop লেবেলে ফিরে যাবে যতক্ষণ না i ৫ এর বেশি হয়। আউটপুট হবে:
0
1
2
3
4
Loop Ended৩.২ goto এর ব্যবহার
goto সাধারণত কোডের মধ্যে একটি নির্দিষ্ট অংশে যেতে ব্যবহৃত হয়, তবে এটি কোডের প্রবাহকে জটিল এবং অস্পষ্ট করতে পারে, তাই এর ব্যবহারে সতর্কতা অবলম্বন করা উচিত। এটি শুধুমাত্র তখন ব্যবহার করা উচিত যখন অন্যান্য নিয়ন্ত্রণ স্টেটমেন্টগুলি যথেষ্ট কার্যকর না হয়।
সারসংক্ষেপ
break: লুপ বা কন্ডিশনাল স্টেটমেন্টের প্রবাহকে তৎক্ষণাৎ থামিয়ে দেয়।continue: লুপের বর্তমান চক্রটি স্কিপ করে পরবর্তী চক্রে চলে যায়।goto: কোডের নির্দিষ্ট লেবেলে চলে যেতে ব্যবহৃত হয়, তবে এটি কোডের প্রবাহকে জটিল করতে পারে এবং সচরাচর ব্যবহৃত হয় না।
এই স্টেটমেন্টগুলি Go-তে লুপ এবং কন্ডিশনাল প্রবাহ নিয়ন্ত্রণের জন্য গুরুত্বপূর্ণ হাতিয়ার, তবে ব্যবহারের সময় সঠিক স্থানে এবং উদ্দেশ্যে তাদের ব্যবহার করা উচিত।
Error Handling in Go: defer, panic, and recover
Go প্রোগ্রামিং ভাষায় এরর হ্যান্ডলিং একটি গুরুত্বপূর্ণ বিষয়, এবং Go-তে এর জন্য তিনটি বিশেষ ফিচার রয়েছে: defer, panic, এবং recover। এই তিনটি ফিচার ব্যবহার করে, আপনি সঠিকভাবে এরর ম্যানেজমেন্ট করতে পারেন এবং প্রোগ্রাম চালানোর সময় সম্ভাব্য সমস্যা মোকাবিলা করতে পারেন। চলুন, এগুলোর বিস্তারিত আলোচনা করা যাক।
১. defer (ডিফার)
defer হল একটি কিওয়ার্ড যা ফাংশনের শেষে একটি ফাংশন কল চালানোর জন্য ব্যবহৃত হয়। যখন কোনো ফাংশন শেষ হয়, তখন defer দ্বারা কল করা ফাংশনটি সঞ্চালিত হয়, তা যতই আগেই ডিফাইন করা হোক না কেন।
defer সাধারণত রিসোর্স ক্লিনআপ, যেমন ফাইল বা নেটওয়ার্ক কানেকশন বন্ধ করার জন্য ব্যবহৃত হয়।
১.১ defer উদাহরণ
package main
import "fmt"
func main() {
fmt.Println("Starting the program...")
// defer ব্যবহার করা
defer fmt.Println("Cleaning up...")
fmt.Println("Executing main tasks...")
}এখানে, defer fmt.Println("Cleaning up...") ফাংশন কলটি main ফাংশনের শেষে চালানো হবে। আউটপুট হবে:
Starting the program...
Executing main tasks...
Cleaning up...defer ফাংশনটি কেবলমাত্র তার উপস্থিতি হওয়া পর্যন্ত বিলম্বিত থাকে এবং প্রোগ্রাম শেষে তার কার্যকর হবে।
১.২ defer ব্যবহার করার সাধারণ ক্ষেত্র
- ফাইল ক্লোজ করা
- ডাটাবেস কানেকশন বন্ধ করা
- লক আনলক করা
২. panic (প্যানিক)
panic হল একটি কিওয়ার্ড যা একটি রUNTIME এরর বা অপ্রত্যাশিত পরিস্থিতি নির্দেশ করতে ব্যবহৃত হয়। যখন panic ঘটে, তা সাধারণত প্রোগ্রামটি বন্ধ করে দেয়। এটি সাধারণত তখন ব্যবহার করা হয় যখন কোনো ফাংশন এমন একটি ত্রুটি বা পরিস্থিতির সম্মুখীন হয়, যা প্রোগ্রাম চালানোর জন্য অগ্রহণযোগ্য।
২.১ panic উদাহরণ
package main
import "fmt"
func main() {
fmt.Println("Starting the program...")
// panic ঘটানো
panic("Something went wrong!")
fmt.Println("This line will never be executed.")
}এখানে, panic("Something went wrong!") কলটি প্রোগ্রামটিকে থামিয়ে দেবে এবং এর পরবর্তী লাইনটি আর এক্সিকিউট হবে না। আউটপুট হবে:
Starting the program...
panic: Something went wrong!
goroutine 1 [running]:
main.main()
/path/to/your/file.go:7 +0x60panic সাধারণত ফাইল বা ডাটাবেস সংযোগের ত্রুটি, ইনভ্যালিড ইনপুট, বা অন্য কোনো ক্রিটিক্যাল ত্রুটি সনাক্ত করতে ব্যবহার করা হয়।
৩. recover (রিকভার)
recover একটি ফাংশন যা সাধারণত defer এর সাথে ব্যবহার করা হয়, যাতে panic এর পরে প্রোগ্রামকে পুনরুদ্ধার করা যায় এবং প্রোগ্রামটি বন্ধ না হয়। এটি মূলত একটি রক্ষা ব্যবস্থা হিসেবে কাজ করে যা panic ঘটলে প্রোগ্রামকে বন্ধ হতে বাধা দেয় এবং তাকে স্বাভাবিক অবস্থায় ফিরিয়ে আনে।
৩.১ recover উদাহরণ
package main
import "fmt"
func riskyFunction() {
// defer এর মধ্যে recover ব্যবহার করা
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from:", r)
}
}()
panic("Something went wrong!")
}
func main() {
fmt.Println("Starting the program...")
riskyFunction() // এটি panic ঘটাবে
fmt.Println("Program is still running...")
}এখানে, riskyFunction ফাংশনটি panic ঘটানোর পর, defer ব্লকের মধ্যে থাকা recover() ফাংশনটি panic থেকে প্রোগ্রামকে রক্ষা করবে এবং panic এর বার্তা প্রিন্ট করবে।
আউটপুট:
Starting the program...
Recovered from: Something went wrong!
Program is still running...৩.২ recover এবং defer এর ব্যবহার
recover সাধারণত defer এর সাথে ব্যবহৃত হয়, কারণ defer কোনো ফাংশনের শেষ মুহূর্তে কার্যকর হয়, যখন panic ঘটানো হয়। এটি নিরাপদভাবে panic এর পরে প্রোগ্রাম চালু রাখে এবং প্রোগ্রামের অবস্থা সংরক্ষণ করতে সাহায্য করে।
defer, panic, recover এর সমন্বয় উদাহরণ
package main
import "fmt"
func functionThatMayPanic() {
// defer ব্লক দিয়ে recover ব্যবহার
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in functionThatMayPanic:", r)
}
}()
// panic ঘটানো
panic("Something bad happened!")
}
func main() {
fmt.Println("Program started...")
functionThatMayPanic() // এখানে panic হবে
fmt.Println("Program continues after recover...")
}আউটপুট:
Program started...
Recovered in functionThatMayPanic: Something bad happened!
Program continues after recover...সারসংক্ষেপ
- defer: এটি একটি ফাংশন কলের জন্য দেরি করে কাজ করার ব্যবস্থা। এটি সাধারণত রিসোর্স ক্লিনআপ এবং আনলকিংয়ের জন্য ব্যবহৃত হয়।
- panic: এটি প্রোগ্রামের মধ্যে একটি গুরুতর ত্রুটি সনাক্ত করলে প্রোগ্রাম বন্ধ করতে ব্যবহৃত হয়। এটি সাধারণত অবাঞ্ছিত বা অপ্রত্যাশিত অবস্থায় ব্যবহৃত হয়।
- recover: এটি panic থেকে প্রোগ্রামকে রক্ষা করার জন্য ব্যবহৃত হয় এবং প্রোগ্রাম চালু রাখে। এটি সাধারণত defer ব্লকের সাথে ব্যবহৃত হয়।
এই তিনটি ফিচার মিলে Go তে শক্তিশালী এরর হ্যান্ডলিং মেকানিজম তৈরি করে, যা প্রোগ্রামের অবস্থা নিয়ন্ত্রণ এবং তার কার্যকারিতা বজায় রাখতে সাহায্য করে।
Read more