Jak wiadomo, język Go nie posiada klas. Można użyć struktur z "dopiętymi" funkcjami aby uzyskać chociaż podstawową ich mechanikę, jednakże często brakuje konstruktorów.
Jedyne, co udało mi się wymyślić, to użycie funkcji. Można ją zastosować zamiast standardowej new(), jednakże nie zadziała to ze strukturami inicjowanymi poprzez make(). Funkcja ta jako argument przyjmuje obiekt implementujący interfejs, który sobie zdefiniujemy i który deklaruje tylko jedną metodę - Init(). W niej zawieramy całą logikę inicjującą.
Na poniższym przykładzie mamy strukturę zawierającą dwie zmienne: X oraz Y. Nasz pseudokonstruktor zaś dodaje ich wartości do siebie i umieszcza wynik w prywatnej zmiennej z.
package main
import "fmt";
type IInitializable interface {
/* Interfejs zawiera deklarację jednej metody,
która będzie naszym konstruktorem */
Init();
};
type Foo struct {
X, Y, z uint8;
};
func (p *Foo) Init() {
p.z = p.X + p.Y;
};
func (p *Foo) String() string {
// Ta metoda nie jest konieczna
return fmt.Sprintf("<%d, %d, %d>", p.X, p.Y, p.z);
};
func __init__(s IInitializable) IInitializable {
// Funkcja wykorzystywana do inicjacji obiektu
s.Init();
return s;
};
func main() {
var t = __init__(&Foo{1, 2, 0});
fmt.Println(t);
};
Nie jest to rozwiązanie zbyt eleganckie, ale działa.
Brak komentarzy:
Prześlij komentarz
Uwaga. Komentarze są moderowane i mogą nie pojawić się natychmiast po utworzeniu. Autor niniejszego bloga zastrzega sobie prawo do niedopuszczenia komentarzy będących SPAMem i/lub nie odnoszących się do komentowanego wpisu i/lub łamiących zasady kulturalnej wymiany opinii.