ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 3 · 5లో పాఠం 2కోర్సులో 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) నుండి మిమ్మల్ని ఏదీ ఆపదు, కానీ మీకు అవసరమైతే ఇది దాదాపు ఎల్లప్పుడూ మీరు ** నిర్మాణం**ని తిరిగి ఇవ్వాల్సిన సంకేతం:

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

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

దీనిని ప్రయత్నించండి

వ్యాయామం#go.m3.l2.e1
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

గుణకం మరియు శేషాన్ని అందించే divmod(a, b int) (int, int)ని నిర్వచించండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

కుండలీకరణాల మధ్య రీటర్న్ రకాలు: `(int, int)`.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం#go.m3.l2.e2
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

safeDiv(a, b int) (int, ఎర్రర్)ని అమలు చేయండి: b == 0 తిరిగి వస్తే (0, errors.New('divisione per Zer')), లేకపోతే (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 ఎల్లప్పుడూ చివరి విలువగా; లోపంపై, సున్నా విలువ + లోపం.
  • పేరున్న రిటర్న్‌లు వేరియబుల్స్‌ను ముందే డిక్లేర్ చేస్తాయి మరియు నేకెడ్ రిటర్న్‌లను ఎనేబుల్ చేస్తాయి.
  • చాలా తక్కువ ఫంక్షన్లలో మాత్రమే నేకెడ్ రిటర్న్స్; అంతకు మించి, చదివే సామర్థ్యం దెబ్బతింటుంది.
  • 2-3 కంటే ఎక్కువ రాబడి? మీరు బహుశా ఒక నిర్మాణం కావాలి.