0Pricing
Go Academy · Lektion

Methoden auf Structs

Value-Receiver gegenüber Pointer-Receiver

Methoden auf Structs ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist eine Methode?

Eine Methode ist eine Funktion mit einem Receiver-Argument. Der Receiver steht zwischen dem Schlüsselwort func und dem Methodennamen und bindet die Funktion an einen Typ.

Value-Receiver

Ein Value-Receiver erhält eine Kopie des Structs. Verwenden Sie ihn, wenn die Methode keinen Zustand ändern muss:

package main
import "fmt"

type Circle struct{ Radius float64 }

func (c Circle) Area() float64 {
    return 3.14159 * c.Radius * c.Radius
}

func main() {
    c := Circle{Radius: 5}
    fmt.Printf("%.2f\n", c.Area()) // 78.54
}

Pointer-Receiver

Ein Pointer-Receiver ermöglicht es der Methode, das Struct zu ändern. Bei großen Structs ist er effizienter:

package main
import "fmt"

type Counter struct{ N int }

func (c *Counter) Increment() { c.N++ }
func (c *Counter) Reset()     { c.N = 0 }

func main() {
    c := Counter{}
    c.Increment(); c.Increment()
    fmt.Println(c.N) // 2
    c.Reset()
    fmt.Println(c.N) // 0
}

Wann Sie Pointer-Receiver verwenden sollten

Verwenden Sie Pointer-Receiver, wenn:

  • die Methode den Receiver ändern muss
  • das Struct groß ist (dadurch wird das Kopieren vermieden)
  • Sie Konsistenz benötigen: Wenn eine Methode einen Pointer-Receiver hat, sollten alle Methoden einen verwenden

Verwenden Sie Value-Receiver, wenn das Struct klein ist und die Methode Daten nur liest.

Method Expressions und Method Values

Methoden können als Werte erster Klasse verwendet werden:

package main
import "fmt"

type Adder struct{ Base int }

func (a Adder) Add(n int) int { return a.Base + n }

func main() {
    a := Adder{Base: 10}
    fn := a.Add          // method value — bound to a
    fmt.Println(fn(5))   // 15
}

Methoden für Nicht-Struct-Typen

Sie können Methoden für jeden benannten Typ im selben Paket definieren, nicht nur für Structs:

package main
import "fmt"

type Celsius float64

func (c Celsius) ToFahrenheit() float64 {
    return float64(c)*9/5 + 32
}

func main() {
    t := Celsius(100)
    fmt.Println(t.ToFahrenheit()) // 212
}

Automatische Pointer-Dereferenzierung

Go nimmt beim Aufruf von Methoden automatisch die Adresse oder dereferenziert den Pointer. Sie müssen (&c).Method() nicht manuell schreiben:

package main
import "fmt"

type Box struct{ Val int }

func (b *Box) Double() { b.Val *= 2 }

func main() {
    b := Box{Val: 5}
    b.Double()           // Go auto-takes address
    fmt.Println(b.Val)   // 10
}

Methoden verketten

Geben Sie den Pointer auf den Receiver zurück, um Methodenverkettung zu ermöglichen (Builder-Pattern):

package main
import "fmt"

type Builder struct{ result string }

func (b *Builder) Add(s string) *Builder {
    b.result += s
    return b
}
func (b *Builder) Build() string { return b.result }

func main() {
    s := (&Builder{}).Add("Hello").Add(", ").Add("World").Build()
    fmt.Println(s)
}

String-Methode (fmt.Stringer)

Implementieren Sie die Methode String() string, um festzulegen, wie ein Typ ausgegeben wird:

package main
import "fmt"

type Point struct{ X, Y int }

func (p Point) String() string {
    return fmt.Sprintf("(%d, %d)", p.X, p.Y)
}

func main() {
    p := Point{3, 4}
    fmt.Println(p) // (3, 4)
}

Nil-Pointer-Receiver

Eine Methode mit Pointer-Receiver kann auf einem Nil-Pointer aufgerufen werden — das ist für Standardverhalten nützlich:

package main
import "fmt"

type Node struct{ Val int }

func (n *Node) Value() int {
    if n == nil { return 0 }
    return n.Val
}

func main() {
    var n *Node
    fmt.Println(n.Value()) // 0
}

Konsistenzprinzip

In Gos Standardbibliothek und im idiomatischen Go verwenden alle Methoden eines Typs dieselbe Receiver-Art — entweder alle Pointer-Receiver oder alle Value-Receiver. Eine Mischung führt bei Interfaces zu schwer erkennbaren Fehlern.

Kurze Überprüfung

Welcher Receiver-Typ ermöglicht es einer Methode, die Felder des Structs zu ändern?

Zusammenfassung: Methoden

Die wichtigsten Erkenntnisse:

  • Methoden haben zwischen func und dem Namen einen Receiver
  • Value-Receiver: zum Lesen, für kleine Structs
  • Pointer-Receiver: zum Ändern, für große Structs und für Konsistenz
  • Go dereferenziert automatisch — Sie müssen (&v).Method() nicht schreiben
  • Implementieren Sie String() string für eine benutzerdefinierte Ausgabe

Übungsaufgabe

Definieren Sie ein BankAccount-Struct mit einem Feld Balance float64. Fügen Sie Pointer-Receiver-Methoden Deposit und Withdraw sowie eine Value-Receiver-Methode String() hinzu.

Häufig gestellte Fragen

Ist die Lektion „Methoden auf Structs“ kostenlos?

Ja — der vollständige Text von „Methoden auf Structs“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Methoden auf Structs“?

Value-Receiver gegenüber Pointer-Receiver Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Go Academy zu starten?

Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Methoden auf Structs“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?

Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Structs definieren und verwenden
  2. Methoden auf Structs
  3. Konstruktor-Patterns
  4. Anonyme Structs und Komposition
← Zurück zu Go Academy