মূল কন্টেন্টে যান
মডিউল 3 · 4-এর পাঠ 5কোর্সে 14/50~12 min
মডিউল পাঠ (4/5)

মান হিসাবে বন্ধ এবং ফাংশন

Go-তে, ফাংশনগুলি হল প্রথম-শ্রেণীর মান: সেগুলিকে বরাদ্দ করা যেতে পারে৷ ভেরিয়েবল, অন্যান্য ফাংশন পাস, এবং ফিরে. A বন্ধ হল a ফাংশন আক্ষরিক (বেনামী) যা ক্যাপচার এর ভেরিয়েবল পরিবেশ যেখানে এটি সংজ্ঞায়িত করা হয়।

ফাংশন আক্ষরিক

কোন নাম ছাড়া একটি ফাংশন, লিখিত ইনলাইন. আপনি অবিলম্বে এটি কল বা এটি বরাদ্দ করুন:

Go
greet := func(name string) {
    fmt.Println("ciao", name)
}
greet("Anna")

// invocata immediatamente:
func() { fmt.Println("subito") }()

greet এর ধরন হল func(string)।

পরিবেশ ক্যাপচার: বন্ধ

আক্ষরিক ফাংশনটি দৃশ্যমান ভেরিয়েবলগুলিকে পড়তে এবং সংশোধন করতে পারে এর আভিধানিক সুযোগ, এমনকি বাইরের ফাংশন ফিরে আসার পরেও:

Go
func counter() func() int {
    n := 0
    return func() int {
        n++
        return n
    }
}

c := counter()
fmt.Println(c(), c(), c())  // 1 2 3

n "বেঁচে" যতক্ষণ অন্তত একটি বন্ধ এটি উল্লেখ করে। প্রতিটি কল counter() একটি নতুন, স্বাধীন n তৈরি করে৷

কলব্যাক হিসাবে বন্ধ

একটি খুব সাধারণ প্যাটার্ন:

Go
nums := []int{3, 1, 2}
sort.Slice(nums, func(i, j int) bool {
    return nums[i] < nums[j]
})

বন্ধটি nums ক্যাপচার করে এবং ক্রম নির্ধারণ করে।

পরামিতি হিসাবে ফাংশন

একটি প্যারামিটার হিসাবে একটি ফাংশন গ্রহণ করতে, এর ধরন লিখুন:

Go
func apply(nums []int, f func(int) int) []int {
    out := make([]int, len(nums))
    for i, n := range nums {
        out[i] = f(n)
    }
    return out
}

double := func(x int) int { return x * 2 }
apply([]int{1, 2, 3}, double)   // [2 4 6]

স্বাক্ষর পড়া কঠিন হয়ে গেলে, একটি টাইপ উপনাম সংজ্ঞায়িত করুন:

Go
type Transform func(int) int
func apply(nums []int, f Transform) []int { ... }

চেষ্টা করে দেখুন

ব্যায়াম#go.m3.l4.e1
প্রচেষ্টা: 0লোড হচ্ছে...

একটি ক্লোজার প্রদানকারী কাউন্টার() সংজ্ঞায়িত করুন: বন্ধের প্রতিটি কল বৃদ্ধি পায় এবং একটি অভ্যন্তরীণ কাউন্টার প্রদান করে।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

রিটার্নের আগে `n` অবশ্যই ঘোষণা করতে হবে; বন্ধ এটি ক্যাপচার.

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম#go.m3.l4.e2
প্রচেষ্টা: 0লোড হচ্ছে...

একটি ফাংশন আক্ষরিক যা 'ciao' প্রিন্ট করে f এ বরাদ্দ করুন, তারপর এটিকে কল করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

সিনট্যাক্স: `f := func() { ... }` তারপর `f()`।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

Quiz#go.m3.l4.e3
প্রস্তুত

এই মুদ্রণ কি? (বন্ধের সুযোগের জন্য সতর্ক থাকুন)

Go
mk := func() func() int {
    x := 0
    return func() int { x++; return x }
}
a := mk()
b := mk()
fmt.Println(a(), a(), b())
উত্তরের বিকল্প

রিক্যাপ

  • ফাংশনগুলি প্রথম-শ্রেণীর: বরাদ্দযোগ্য, পাসযোগ্য, ফেরতযোগ্য।
  • ফাংশন আক্ষরিক: func(params) ret { ... }, বেনামী।
  • বন্ধ: আভিধানিক সুযোগের ভেরিয়েবলগুলি ক্যাপচার করে, তাদের জীবিত রাখে।
  • প্যারামিটারে স্পষ্ট ফাংশনের ধরন: func(int) int।
  • Go 1.22 থেকে, প্রত্যেকের জন্য পুনরাবৃত্তির লুপ ভেরিয়েবলের নিজস্ব কপি রয়েছে।