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 mainimport "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.