Sobes.tech
Junior

Was bedeutet das Vorhandensein eines Sternchens beim Empfänger in Go?

sobes.tech KI

Antwort von AI

Das Vorhandensein eines Sternchens (*) bei einem Empfänger in Go bedeutet, dass die Methode auf einen Zeiger auf eine Instanz des Typs aufgerufen wird und nicht auf den Wert des Typs.

Die wichtigsten Konsequenzen sind:

  1. Zustandsänderung: Eine Methode mit Zeigerempfänger kann die Felder der Struktur (oder eines anderen Typs), auf die der Zeiger zeigt, ändern. Ohne Sternchen arbeitet die Methode mit einer Kopie des Wertes, und Änderungen innerhalb der Methode wirken sich nicht auf das Original aus.
  2. Leistung: Das Übergeben eines Zeigers kann effizienter sein als das Übergeben einer großen Struktur nach Wert, da nur die Speicheradresse übergeben wird, nicht die gesamte Struktur.
  3. Nil-Werte: Methoden mit Zeigerempfänger können auf nil-Zeigern aufgerufen werden, was nützlich sein kann, um solche Fälle elegant zu behandeln.

Beispiel:

package main

import "fmt"

type Counter struct {
	value int
}

// Methode mit Wertempfänger: ändert das ursprüngliche Counter nicht
func (c Counter) IncrementByValue() {
	c.value++ // Es wird nur die Kopie geändert
}

// Methode mit Zeigerempfänger: ändert das ursprüngliche Counter
func (c *Counter) IncrementByPointer() {
	c.value++ // Der ursprüngliche Wert wird geändert
}

func main() {
	c1 := Counter{value: 0}
	c1.IncrementByValue()
	fmt.Println("Wert nach IncrementByValue:", c1.value) // Gibt 0 aus

	c2 := Counter{value: 0}
	c2.IncrementByPointer()
	fmt.Println("Wert nach IncrementByPointer:", c2.value) // Gibt 1 aus
}