Die folgende Kolumne stellt die Bedeutung und Verwendung von Verschlüssen in Golang aus der Kolumne golang-Tutorial vor. Ich hoffe, dass sie Freunden in Not hilfreich sein wird!
Was ist eine Schließung?
Go-Funktion kann ein Abschluss sein. Ein Abschluss ist ein Funktionswert, der auf eine Variable außerhalb des Funktionskörpers verweist. Diese Funktion kann auf die referenzierte Variable zugreifen und ihr Werte zuweisen; mit anderen Worten, die Funktion ist an die Variable „gebunden“.
Mein unzuverlässiges Verständnis: Ein Abschluss entspricht einer Instanz einer Klasse, und Variablen außerhalb des Funktionskörpers entsprechen den in dieser Instanz gespeicherten Variablen.
Wenn kein Abschluss erfolgt, handelt es sich bei der Funktion um eine einmalige Transaktion. Nachdem die Funktion ausgeführt wurde, kann der Wert der Variablen in der Funktion nicht geändert werden (der Speicher sollte freigegeben werden). Solange die Variable nicht freigegeben wird, bleibt die Funktion immer aktiv und exklusiv, sodass der Wert der Variablen in der Funktion später geändert werden kann (da auf diese Weise der Speicher nicht von Go zurückgefordert wird). und es wird immer dort zwischengespeichert).
Die Hauptbedeutung der Schließung
besteht darin, den Umfang der Variablen zu verringern und die Verschmutzung globaler Variablen zu verringern. Wenn die folgende Akkumulation mithilfe globaler Variablen implementiert wird, werden die globalen Variablen leicht durch andere kontaminiert. Wenn ich n Akkumulatoren implementieren möchte, benötige ich gleichzeitig jedes Mal n globale Variablen. Mithilfe des Rucksacks verfügt jeder generierte Akkumulator myAdder1, myAdder2 := adder(), adder()
über eine eigene unabhängige Summe, die als myAdder1.sum und myAdder2.sum angezeigt werden kann.
Mit Rucksäcken können Sie Funktionen mit eigenen Zuständen implementieren!
package mainimport ( "fmt")func adder() func(int) int { sum := 0 return func(x int) int { sum += x return sum }}func main() { myAdder := adder() // 从1加到10 for i := 1; i <= 10; i++ { myAdder(i) } fmt.Println(myAdder(0)) // 再加上45 fmt.Println(myAdder(45))}
Ergebnis:
55 // 1+...+10 100
Beispiel
Verwenden Sie den Abschluss, um die Fibonacci-Sequenz zu implementieren
package mainimport ( "fmt")func fibonacci() func() int { b0 := 0 b1 := 1 return func() int { tmp := b0 + b1 b0 = b1 b1 = tmp return b1 }}func main() { myFibonacci := fibonacci() for i := 1; i <= 5; i++ { fmt.Println(myFibonacci()) }}
Ergebnis:
1 2 3 5 8
Man kann leicht Fehler machen
func B() []func() { b := make([]func(), 3, 3) for i := 0; i < 3; i++ { b[i] = func() { fmt.Println(i) } } return b}func main() { c := B() c[0]() c[1]() c[2]()}
Ergebnis:
// 因为都引用i,i最后变成了3 3 3 3
Korrekturmethode 1:
package mainimport ( "fmt")func B() []func() { b := make([]func(), 3, 3) for i := 0; i < 3; i++ { j := i b[i] = func() { fmt.Println(j) } } return b}func main() { c := B() c[0]() c[1]() c[2]()}
Korrekturmethode 2:
package mainimport ( "fmt")func B() []func() { b := make([]func(), 3, 3) for i := 0; i < 3; i++ { b[i] = func(j int) func(){ return func() { fmt.Println(j) } }(i) } return b}func main() { c := B() c[0]() c[1]() c[2]()}
Weitere verwandte technische Artikel finden Sie in der go languagetutorial-Kolumne!
Das obige ist der detaillierte Inhalt vonKennen Sie die Bedeutung und Verwendung von Verschlüssen in Golang?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!