Heim > Backend-Entwicklung > Golang > Kennen Sie die Bedeutung und Verwendung von Verschlüssen in Golang?

Kennen Sie die Bedeutung und Verwendung von Verschlüssen in Golang?

藏色散人
Freigeben: 2020-12-24 15:25:42
nach vorne
2371 Leute haben es durchsucht

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!

Kennen Sie die Bedeutung und Verwendung von Verschlüssen in Golang?

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))}
Nach dem Login kopieren

Ergebnis:

55		// 1+...+10
100
Nach dem Login kopieren

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())
	}}
Nach dem Login kopieren

Ergebnis:

1
2
3
5
8
Nach dem Login kopieren

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]()}
Nach dem Login kopieren

Ergebnis:

// 因为都引用i,i最后变成了3
3
3
3
Nach dem Login kopieren

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]()}
Nach dem Login kopieren

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]()}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage