முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 3 · பாடம் 5 இன் 5பாடத்திட்டத்தில் 15/50~12 min
தொகுதி பாடங்கள் (5/5)

`ஒத்திவைத்தல்`: உத்தரவாதமான சுத்தம்

defer அழைப்பை செயல்படுத்துவதை ** இணைக்கும் செயல்பாடு வரை ஒத்திவைக்கிறது திரும்புகிறது**. செயல்பாடு பீதியில் வெளியேறினாலும் அது இயங்கும். பல deferவி அதே செயல்பாட்டில் LIFO வரிசையில் இயக்கவும் (கடைசி-இன், முதல்-அவுட்).

இது வளத்தை சுத்தம் செய்வதற்கான இடியோமடிக் பொறிமுறையாகும்: கோப்புகளை மூடுதல், மியூடெக்ஸ்களைத் திறத்தல், இணைப்புகளை வெளியிடுதல், நிலையை மீட்டமைத்தல்.

தொடரியல் மற்றும் நியமன பயன்பாட்டு வழக்கு

Go
f, err := os.Open(path)
if err != nil {
    return err
}
defer f.Close()   // chiamata SEMPRE all'uscita della funzione

// ... usa f liberamente ...
return nil

பொதுவானது: f.Close(), mu.Unlock(), db.Close(), tx.Rollback(), recover().

வாதங்கள் உடனடியாக மதிப்பீடு செய்யப்பட்டு, மரணதண்டனை ஒத்திவைக்கப்பட்டது

நீங்கள் defer foo(x) என்று எழுதும்போது, x அந்த நேரத்தில் மதிப்பிடப்படும் defer, செயல்படுத்தும் நேரத்தில் இல்லை:

Go
x := 10
defer fmt.Println(x)   // cattura 10
x = 99
// quando la funzione ritorna stampa "10", non "99"

LIFO ஆர்டர்

ஸ்டாக் அப் மற்றும் மிக சமீபத்தியவற்றில் தொடங்கி செயல்படுத்துவதை ஒத்திவைக்கிறது:

Go
defer fmt.Println(1)
defer fmt.Println(2)
defer fmt.Println(3)
// output: 3, 2, 1

இது வள சொற்பொருளுடன் ஒத்துப்போகிறது: கடைசியாக திறக்கப்பட்டது முதல் மூட வேண்டும்.

defer + recover: பீதியைக் கையாளுதல்

defer ஒரு panic ஐ இடைமறிக்க ஒரே வழி:

Go
func safe() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("recuperato:", r)
        }
    }()
    panic("boom")
}

பிட்ஃபால்: defer ஒரு லூப்பில்

defer f.Close() ஐ ஒரு லூப்பில் வைப்பது இறுதி வரை ஒத்திவைப்புகளை குவிக்கும் செயல்பாடு**, ஒவ்வொரு மறு செய்கைக்கும் அல்ல. ஒரு நீண்ட சுழற்சியில் நீங்கள் பல கோப்புகளைத் திறக்கிறீர்கள் செயல்பாடு வெளியேறும் போது மட்டுமே அவற்றை மூடவும்: கோப்பு விளக்கக் கசிவு அபாயம்.

Go
// MALE: defer accumulati
for _, path := range paths {
    f, _ := os.Open(path)
    defer f.Close()   // chiude TUTTI alla fine della funzione esterna
    // ...
}

// MEGLIO: estrai in una funzione
for _, path := range paths {
    elabora(path)   // ogni chiamata ha il proprio scope di defer
}

முயற்சி செய்து பாருங்கள்

உடற்பயிற்சி#go.m3.l5.e1
முயற்சிகள்: 0ஏற்றுகிறது…

'inizio' அச்சிடவும், பின்னர் 'நன்றாக' அச்சிடுவதை ஒத்திவைக்கவும், பின்னர் 'mezzo' ஐ அச்சிடவும். வெளியீடு இருக்க வேண்டும்: inizio / mezzo / fine.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

பிரதான() திரும்ப வரும்போது ஒத்திவைப்பு இயங்கும்.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

உடற்பயிற்சி#go.m3.l5.e2
முயற்சிகள்: 0ஏற்றுகிறது…

குறியீட்டில் அந்த வரிசையில் 1, 2 மற்றும் 3 ஐ அச்சிடும் மூன்று தொடர்ச்சியான ஒத்திவைப்புகளை எழுதவும். வெளியீடு 3/2/1 (LIFO) ஆக இருக்கும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

வரிசையில் மூன்று ஒத்திவைப்புகள்; அவை தலைகீழ் வரிசையில் செயல்படுகின்றன என்பதை நினைவில் கொள்க.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

Quiz#go.m3.l5.e3
தயார்

இது என்ன அச்சிடுகிறது? (குறிப்பு: ஒத்திவைப்பு வாதங்கள் உடனடியாக மதிப்பீடு செய்யப்படும்)

Go
x := 10
defer fmt.Println(x)
x = 99
பதில் விருப்பங்கள்

மறுபரிசீலனை

  • defer call() செயல்பாடு திரும்பும் வரை செயல்படுத்தலை ஒத்திவைக்கிறது.
  • பல ஒத்திவைப்புகள் = LIFO ஆர்டர்.
  • வாதங்கள் உடனடியாக மதிப்பிடப்பட்டன, மரணதண்டனை ஒத்திவைக்கப்பட்டது.
  • உறுதியான சுத்தம் செய்யப் பயன்படுகிறது: கோப்புகள், மியூடெக்ஸ்கள், இணைப்புகள்.
  • defer + recover() ஒரு panic (அரிதாக, எல்லைகளில்) குறுக்கிடுகிறது.
  • ஒரு நீண்ட வளையத்திற்குள் defer ஒருபோதும் இல்லை: வெளிப்புற செயல்பாடு திரும்பும் வரை அது குவிகிறது.