தொகுதி பாடங்கள் (5/5)
`ஒத்திவைத்தல்`: உத்தரவாதமான சுத்தம்
defer அழைப்பை செயல்படுத்துவதை ** இணைக்கும் செயல்பாடு வரை ஒத்திவைக்கிறது
திரும்புகிறது**. செயல்பாடு பீதியில் வெளியேறினாலும் அது இயங்கும். பல deferவி
அதே செயல்பாட்டில் LIFO வரிசையில் இயக்கவும் (கடைசி-இன், முதல்-அவுட்).
இது வளத்தை சுத்தம் செய்வதற்கான இடியோமடிக் பொறிமுறையாகும்: கோப்புகளை மூடுதல், மியூடெக்ஸ்களைத் திறத்தல், இணைப்புகளை வெளியிடுதல், நிலையை மீட்டமைத்தல்.
தொடரியல் மற்றும் நியமன பயன்பாட்டு வழக்கு
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, செயல்படுத்தும் நேரத்தில் இல்லை:
x := 10
defer fmt.Println(x) // cattura 10
x = 99
// quando la funzione ritorna stampa "10", non "99"LIFO ஆர்டர்
ஸ்டாக் அப் மற்றும் மிக சமீபத்தியவற்றில் தொடங்கி செயல்படுத்துவதை ஒத்திவைக்கிறது:
defer fmt.Println(1)
defer fmt.Println(2)
defer fmt.Println(3)
// output: 3, 2, 1இது வள சொற்பொருளுடன் ஒத்துப்போகிறது: கடைசியாக திறக்கப்பட்டது முதல் மூட வேண்டும்.
defer + recover: பீதியைக் கையாளுதல்
defer ஒரு panic ஐ இடைமறிக்க ஒரே வழி:
func safe() {
defer func() {
if r := recover(); r != nil {
fmt.Println("recuperato:", r)
}
}()
panic("boom")
}பிட்ஃபால்: defer ஒரு லூப்பில்
defer f.Close() ஐ ஒரு லூப்பில் வைப்பது இறுதி வரை ஒத்திவைப்புகளை குவிக்கும்
செயல்பாடு**, ஒவ்வொரு மறு செய்கைக்கும் அல்ல. ஒரு நீண்ட சுழற்சியில் நீங்கள் பல கோப்புகளைத் திறக்கிறீர்கள்
செயல்பாடு வெளியேறும் போது மட்டுமே அவற்றை மூடவும்: கோப்பு விளக்கக் கசிவு அபாயம்.
// 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
}முயற்சி செய்து பாருங்கள்
'inizio' அச்சிடவும், பின்னர் 'நன்றாக' அச்சிடுவதை ஒத்திவைக்கவும், பின்னர் 'mezzo' ஐ அச்சிடவும். வெளியீடு இருக்க வேண்டும்: inizio / mezzo / fine.
குறிப்பைக் காட்டு
பிரதான() திரும்ப வரும்போது ஒத்திவைப்பு இயங்கும்.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்
குறியீட்டில் அந்த வரிசையில் 1, 2 மற்றும் 3 ஐ அச்சிடும் மூன்று தொடர்ச்சியான ஒத்திவைப்புகளை எழுதவும். வெளியீடு 3/2/1 (LIFO) ஆக இருக்கும்.
குறிப்பைக் காட்டு
வரிசையில் மூன்று ஒத்திவைப்புகள்; அவை தலைகீழ் வரிசையில் செயல்படுகின்றன என்பதை நினைவில் கொள்க.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்
இது என்ன அச்சிடுகிறது? (குறிப்பு: ஒத்திவைப்பு வாதங்கள் உடனடியாக மதிப்பீடு செய்யப்படும்)
x := 10
defer fmt.Println(x)
x = 99மறுபரிசீலனை
defer call()செயல்பாடு திரும்பும் வரை செயல்படுத்தலை ஒத்திவைக்கிறது.- பல ஒத்திவைப்புகள் = LIFO ஆர்டர்.
- வாதங்கள் உடனடியாக மதிப்பிடப்பட்டன, மரணதண்டனை ஒத்திவைக்கப்பட்டது.
- உறுதியான சுத்தம் செய்யப் பயன்படுகிறது: கோப்புகள், மியூடெக்ஸ்கள், இணைப்புகள்.
defer+recover()ஒருpanic(அரிதாக, எல்லைகளில்) குறுக்கிடுகிறது.- ஒரு நீண்ட வளையத்திற்குள்
deferஒருபோதும் இல்லை: வெளிப்புற செயல்பாடு திரும்பும் வரை அது குவிகிறது.