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
funcund 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() stringfü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
- Structs definieren und verwenden
- Methoden auf Structs
- Konstruktor-Patterns
- Anonyme Structs und Komposition