ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 3 · 5లో పాఠం 4కోర్సులో 14/50~12 min
మాడ్యూల్ పాఠాలు (4/5)

విలువలుగా మూసివేతలు మరియు విధులు

గోలో, ఫంక్షన్‌లు ఫస్ట్-క్లాస్ విలువలు: వాటిని కేటాయించవచ్చు వేరియబుల్స్, ఇతర ఫంక్షన్‌లకు పంపబడ్డాయి మరియు తిరిగి వచ్చాయి. ఒక మూసివేయడం అనేది 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.
  • గో 1.22 నుండి, పునరావృతం కోసం ప్రతి దాని స్వంత లూప్ వేరియబుల్ కాపీని కలిగి ఉంటుంది.