In Go sind Methoden Funktionen mit einem receiver (Empfänger), der angibt, zu welchem Typ die Methode gehört:
type User struct { Name string } func (u *User) SayHello() { fmt.Println("Hallo,", u.Name) }
(u *User)) fungiert als erstes Argument der Funktion, aber der Syntax und die Aufrufe unterscheiden sich.Wichtig! Methoden können nur für Typen deklariert werden, die in Ihrem Paket definiert sind (keine Methoden für Typen, die in einem anderen Paket definiert sind, einschließlich eingebauter Typen). Das Verhalten mit Aliasen (type alias) ist besonders:
type MyInt int) – können Methoden hinzugefügt werden.type MyInt = int) – können keine Methoden hinzugefügt werden, da dies nur ein Alias ist.Beispiel:
type MyInt int func (m MyInt) Double() int { return int(m) * 2 } // Type alias type MyIntAlias = int // func (m MyIntAlias) Double() int { ... } // Kompilierungsfehler
Kann man eine Methode für einen Slice vom Typ []int oder für ein type alias deklarieren?
Antwort: Für einen Slice des eingebauten Typs ([]int) können keine Methoden deklariert werden. Für einen neuen benutzerdefinierten Typ auf Basis eines Slices – ist es möglich:
type MySlice []int func (s MySlice) Sum() int { ... } // erlaubt
Für type alias ist es nicht möglich:
type SuperSlice = []int // func (s SuperSlice) Sum() int { ... } // Fehler
Geschichte
Geschichte
Geschichte
Bei dem Versuch, Methoden zu Typen aus einem externen Paket (zum Beispiel time.Time) hinzuzufügen, um die Arbeit mit Daten zu standardisieren, stellte sich heraus, dass dies in Go nicht möglich ist – sie mussten Komposition und Hilfsfunktionen verwenden.