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

একাধিক রিটার্ন এবং নাম রিটার্ন

Go-তে, একটি ফাংশন একাধিক মান প্রদান করতে পারে। এটা মেকানিজম যে (value, error) প্যাটার্নটি সক্রিয় করে যা আপনি ইতিমধ্যে দেখেছেন এবং এটি ছড়িয়ে পড়ে৷ পুরো স্ট্যান্ডার্ড লাইব্রেরি।

একাধিক রিটার্ন

রিটার্ন প্রকারগুলি বন্ধনীর মধ্যে যায়, কমা দ্বারা পৃথক করা হয়:

Go
func divmod(a, b int) (int, int) {
    return a / b, a % b
}

q, r := divmod(17, 5) // q=3, r=2

তারা একাধিক অ্যাসাইনমেন্ট দিয়ে ধ্বংস করা হয়. একটি বাতিল করতে মান ব্যবহার করে _:

Go
_, r := divmod(17, 5) // solo il resto

ক্যানোনিকাল (T, error) প্যাটার্ন

প্রায় সমস্ত stdlib এটি অনুসরণ করে। error সর্বদা শেষ:

Go
func read(path string) ([]byte, error) {
    data, err := os.ReadFile(path)
    if err != nil {
        return nil, fmt.Errorf("read %q: %w", path, err)
    }
    return data, nil
}

নামকৃত রিটার্ন

আপনি রিটার্ন মানগুলির নাম দিতে পারেন: তারা পূর্ব-ঘোষিত ভেরিয়েবলে পরিণত হয় শূন্যতে আরম্ভ করা হয়েছে, এবং return কোনো যুক্তি ছাড়াই তাদের ফেরত দেয় ("নগ্ন প্রত্যাবর্তন"):

Go
func divmod(a, b int) (q, r int) {
    q = a / b
    r = a % b
    return       // naked: ritorna q, r
}

নামযুক্ত রিটার্নগুলি ডকুমেন্টেশন টুলটিপগুলিতেও উপস্থিত হয়, তাই সেগুলি দরকারী৷ জটিল ফাংশনগুলির জন্য ইনলাইন ডকুমেন্টেশন একটি ফর্ম হিসাবে — শুধু নয় নগ্ন প্রত্যাবর্তনের জন্য

দুটির বেশি রিটার্ন?

কোনো কিছুই আপনাকে (int, int, int, error) থেকে আটকায় না, কিন্তু আপনি যদি প্রয়োজন মনে করেন এটি প্রায় সবসময় একটি চিহ্ন যে আপনার একটি struct ফেরত দেওয়া উচিত:

Go
type Result struct {
    Sum  int
    Avg  float64
    Max  int
}

func analyze(nums []int) (Result, error) { ... }

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

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

ডিভমোড (a, b int) (int, int) সংজ্ঞায়িত করুন যা ভাগফল এবং অবশিষ্টাংশ প্রদান করে।

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

বন্ধনীর মধ্যে রিটার্ন প্রকার: `(int, int)`।

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

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

safeDiv(a, b int) (int, error): যদি b == 0 ফিরে আসে (0, errors.New('divisione per zero')), অন্যথায় (a/b, nil)।

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

সর্বদা শেষ মান হিসাবে ত্রুটি। ত্রুটিতে: শূন্য মান + ত্রুটি।

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

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

নাম রিটার্ন ব্যবহার করে এই প্রোগ্রামটি কি মুদ্রণ করে?

Go
func f() (a, b int) {
    a = 1
    b = 2
    return
}
x, y := f()
fmt.Println(x, y)
উত্তরের বিকল্প

রিক্যাপ

  • বন্ধনীর মধ্যে একাধিক মান: func f() (T1, T2, error)।
  • কনভেনশন: error ALWAYS শেষ মান হিসাবে; ত্রুটির উপর, শূন্য মান + ত্রুটি।
  • নামযুক্ত রিটার্নগুলি ভেরিয়েবলগুলিকে পূর্ব ঘোষণা করে এবং নগ্ন রিটার্ন সক্ষম করে।
  • শুধুমাত্র খুব সংক্ষিপ্ত ফাংশনে নগ্ন রিটার্ন; এর বাইরে, পাঠযোগ্যতা ক্ষতিগ্রস্থ হয়।
  • 2-3 বেশি রিটার্ন? আপনি সম্ভবত একটি struct চান.