0 Tage Serie
go / intermediate
Snippet

Auswertungszeitpunkt von Argumenten in defer verstehen

Argumente für eine verzögerte (defer) Funktion werden sofort ausgewertet, wenn die defer-Zeile erreicht wird, nicht erst, wenn die tatsächliche Funktion am Ende des umgebenden Blocks ausgeführt wird. Dieses Verhalten ist wichtig beim Übergeben von Werten oder Aufrufen von Tracking-Funktionen.

snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main
import "fmt"
func trace(message string) string {
fmt.Println("Evaluating trace:", message)
return message
}
func execute() {
action := "Start"
defer fmt.Println("Deferred action executed:", trace(action))
action = "Finish"
fmt.Println("Main execution completed")
}
func main() {
execute()
}
Erklärung
1
defer fmt.Println("Deferred action executed:", trace(action))
Registriert die Print-Anweisung und wertet das Argument der Hilfsfunktion sofort aus.
2
trace(action)
Wird während der Auswertung der Defer-Anweisung ausgeführt und erfasst 'Start'.
3
action = "Finish"
Ändert die Variable, aber das verzögerte Print-Argument wurde bereits aufgelöst.
4
fmt.Println("Main execution completed")
Wird ausgegeben, bevor die verzögerte Anweisung schließlich ihre ausgewerteten Argumente ausgibt.