1 অজানা ফাংশনের বেসিক

1.1 অজানা ফাংশনের সৈকোধিক পরিচিতি

অজানা ফাংশন হলো নামবিহীন ফাংশন। এটি সরাসরি স্থানীয় সংক্ষেপণ অথবা অল্প জীবনকালীন অবস্থার জন্য প্রয়োজনীয় জায়গায় সরাসরি সূচিত এবং ব্যবহৃত হয়। নামযুক্ত ফাংশনের তুলনায়, অজানা ফাংশন একটি নামের প্রয়োজন না করে, যা মানে অতিরিক্ত ভরি না থাকা এবং স্থানীয় ভেরিয়েবলে সূচিত বা এক্সপ্রেশনে সরাসরি ব্যাবহার করা যেতে পারে।

1.2 অজানা ফাংশনের সূচনা এবং ব্যবহার

Go ভাষায়, অজানা ফাংশন সংজ্ঞাত করার জন্য মৌলিক সিনট্যাক্স নিম্নলিখিত ভাবে:

func(আর্গুমেন্ট) {
    // ফাংশনের বডি
}

অজানা ফাংশনের ব্যবহারসমূহ দুই ভাগে ভাগ করা যেতে পারে: একটি ভেরিয়েবলকে সোনানো বা সরাসরি নিবেদিত.

  • ভেরিয়েবলে বরাদ্দ করা:
sum := func(a int, b int) int {
    return a + b
}

result := sum(3, 4)
fmt.Println(result) // আউটপুট: 7

এই উদাহরণে, অজানা ফাংশনটির ভেরিয়েবল যোগকে অ্যাসাইন করা হয়, এবং তারপরে আমরা যেমন সাধারণ ফাংশনকে একইভাবে যোগ কল করতে পারি।

  • সরাসরি সাধারণ ফাংশন (এর মোটামুটি নামযুক্ত কর্মকর্তা অজানা ফাংশন):
func(a int, b int) {
    fmt.Println(a + b)
}(3, 4) // আউটপুট: 7

এই উদাহরণে, অজানা ফাংশনটির পর্যাবাচন বর্তমানে সরাসরি পরিভাষিত হওয়ার পরে স্থানীয় এক্সিকিউট হয়, এক্ষুনি কোনও ভেরিয়েবলে অ্যাসাইন করার প্রয়োজন নেই।

1.3 অজানা ফাংশন পরিবর্তনের প্রায়োগিক উদাহরণ

অজানা ফাংশনগুলি Go ভাষায় প্রচলিত এবং এখানে কিছু সাধারণ পরিস্থিতি রয়েছে:

  • যোগাতামের ফাংশন হিসাবে: অজানা ফ

2.2 অজানা ফাংশন সাথে সম্পর্ক

অজানা ফাংশন এবং ক্লোজার খুব নিকটবর্তী সম্পর্কে রয়েছে। Go ভাষায়, অজানা ফাংশন হল এমন একটি ফাংশন যা বিনামूল্যে সংজ্ঞায়িত করা এবং প্রয়োজনে তা তৎপরতা সহকারে ব্যবহার করা যায়। এই ধরনের ফাংশন খুব উপযুক্ত যেহেতু ক্লোজার আচরণ সম্পাদন করার জন্য।

অজানা ফাংশনের মধ্যে সাধারণভাবে ক্লোজার প্রযুক্তি অন্তর্ভুক্ত থাকে, যা তাদের ঘিরের বাহ্যিক বস্তুতে থেকে ভেরিয়েবল ধরতে পারে। যখন একটি অজানা ফাংশন বাহ্যিক scope থেকে ভেরিয়েবল নিয়ে আলোচনা করে, তখন অজানা ফাংশন, এবং রেফারেন্সকৃত ভেরিয়েবলগুলি একটি ক্লোজার আকার গ্রহণ করে।

func main() {
    adder := func(sum int) func(int) int {
        return func(x int) int {
            sum += x
            return sum
        }
    }

    sumFunc := adder()
    println(sumFunc(2))  // আউটপুট: 2
    println(sumFunc(3))  // আউটপুট: 5
    println(sumFunc(4))  // আউটপুট: 9
}

এখানে, ফাংশন adder একটি অজানা ফাংশন ফেরৎ করে, যা ভেরিয়েবল sum এর উপর ভেরিয়েবলের উল্লেখ করে একটি ক্লোজার গঠন করে।

2.3 ক্লোজারের চরিত্র

ক্লোজারের প্রায়ই স্মরণ ায় বার্তা হল তাদের নিয়ামিত বাস্তবায়িকের মধ্যে স্মরণ রাখার ক্ষমতা। তারা তাদের নিজের ফাংশনের বাইরে সংজ্ঞায়িত ভেরিয়েবলগুলি অ্যাক্সেস করতে পারে। ক্লোজারের স্বভাবের মধ্যেঅন্তর্ভুক্ত, বাহ্যিক ভেরিয়েবলদের রেফারেন্স করে, প্রোগ্রামিং-এর অনেক শক্তিশালী বৈশিষ্ট্য সম্পাদনের জন্য মূল সাধারণ ফাউন্ডেশন প্রদান করে। যেমন ডেকোরেটর, অবস্থা এনক্যাপসুলেশন, এবং অলিঃ মূল্যায়ন।

অবস্থা এনক্যাপসুলেশনের পাশাপাশি, ক্লোজারের নিম্নলিখিত চরিত্রগুলো রয়েছে:

  • ভেরিয়েবলের আয়োগ বাড়ানো: ক্লোজার দ্বারা রেফারেন্সকৃত বাহ্যিক ভেরিয়েবলের বিকল্প সময় ধরতে - বাহ্যিক ভেরিয়েবলের আয়োগ সুরক্ষিত রয়েছে।
  • বিশেষ করে ব্যক্তিগত ভেরিয়েবলের এনক্যাপসুলেশন: অন্যান্য পদ্ধতিসমূহ নিকটতম পদ্ধতিতে ক্লোজারের অভ্যন্তরীণ ভেরিয়েবলগুলির প্রায়ই সরাসরি অ্যাক্সেস করতে পারে না, গোপনীয় ভেরিয়েবলগুলি এনক্যাপসুলেশনের একটি উপায় প্রদান করে।

2.4 প্রচলিত ঝামেলা এবং বিবেচনা

ক্লোজার ব্যবহার করা সময়, কিছু প্রচলিত ঝামেলা এবং বিবেচনা রয়েছে:

  • লুপ ভেরিয়েবল বাইন্ডিং সমস্যা: লুপের ভেরিয়েবলটি প্রোগ্রামের লুপ সংক্রান্ত গোপ্যবস্থানে সরাসরি ব্যবহার করা সমস্যাদায়ক হতে পারে কারণ লুপের নির্দেশে ভেরিয়েবলের ঠিকানা প্রতিটি লুপ অবস্থার সাথে পরিবর্তন করেনা।
for i := 0; i < 3; i++ {
    defer func() {
        println(i)
    }()
}
// আউটপুট মোট প্রত্যাশিত 0, 1, 2, হয়েছে 3, 3, 3

এই পিটফল থেকে বিচ্যুতির জন্য, লুপের ভেরিয়েবলটি সংস্কুত খালি সাধারণ হতে হবে:

for i := 0; i < 3; i++ {
    defer func(i int) {
        println(i)
    }(i)
}
// সঠিক আউটপুট: 0, 1, 2
  • ক্লোজার মেমোরি লিক: যদি একটি ক্লোজারের একটি বড় সাথে সাথে স্থানীয় ভেরিয়েবলের একটি উল্লেখ থাকে এবং এই ক্লোজারটি দ্রুত ধরার জন্য বজানা হয়, তাহলে স্থানীয় ভেরিয়েবলটি পুনরুদ্ধার করা হবে না, যা মেমোরি লিকের কারণ হতে পারে।

  • ক্লোজার সঙ্গে সমত্যাংক ঝামেলা: যদি একটি ক্লোজার অনুশীলিত সমত্যাংক এবং এটা কোনো নির্দিষ্ট ভেরিয়েবলের রেফারেন্স করে, তবে এটা নিশ্চিত করতে হবে যে এই রেফারেন্স সমত্যাংক নিরাপদ হওয়া উচিত। একইভাবে, সিঙ্ক্রোনাইজেশন প্রিমিটিভ যেমন মিউটেক্স লক প্রয়োজনের হতে পারে।

এই ঝামেলা এবং বিবেচনা বুঝতে শিখলে, বিকাশকারীরা ক্লোজার একাধিক নিরাপদ এবং দক্ষতাশীলভাবে ব্যবহার করতে সাহায্য করে।