W języku Go programista może tworzyć własne typy na bazie istniejących lub ogłaszać aliasy dla ułatwienia czytelności kodu i integracji z zewnętrznymi bibliotekami.
Historia zagadnienia:
Go zasadniczo upraszcza system typów, rozdzielając pojęcia tworzenia nowego typu (type MyInt int) i aliasu (type MyIntAlias = int). Często pojawia się nieporozumienie między nimi, co wpływa na kompatybilność danych między różnymi częściami systemu.
Problem:
Jeśli niewłaściwie wybierzesz sposób ogłaszania typu, możesz napotkać wiele niejawnych błędów: niemożność przesyłania danych między pakietami, niewłaściwa praca z zewnętrznymi bibliotekami lub utrata wszystkich metod podczas próby użycia aliasu.
Rozwiązanie:
Przykład kodu:
package main import "fmt" type MyInt int // nowy typ func (m MyInt) Double() int { return int(m) * 2 } type MyIntAlias = int // alias typu func main() { var a MyInt = 5 var b MyIntAlias = 10 fmt.Println(a.Double()) // działa //fmt.Println(b.Double()) // błąd: metoda nie zdefiniowana dla int }
Kluczowe cechy:
Czy można zrobić alias struktury i dodać do niego metody różne od struktury bazowej?
Nie. Metody można ogłaszać tylko dla nowego typu, a nie dla aliasu. Alias to po prostu inna nazwa dla tego samego typu, część programu nie dowie się o "rozszerzeniu" typu.
type MyStructAlias = SomeStruct // func (s MyStructAlias) NewMethod() {} // Błąd
Czy metody typu bazowego mogą automatycznie "przyczepić się" do aliasu?
Tak, ponieważ to ten sam typ dla kompilatora. Ale nie można pracować z nowymi metodami: nie możesz dodać unikalnych metod do aliasu.
type MyString = string // wszystkie metody i funkcje działają dla string
Czym różni się rzutowanie na typ i na alias?
Przy ogłaszaniu nowego typu wymagana jest jawna konwersja: MyInt(x), gdzie x — int. Dla aliasu rzutowanie nie jest potrzebne — typy są całkowicie zamienne.
type A int type B = int var x int = 3 var a A = A(x) // jawna konwersja var b B = x // niejawnie, to to samo co int
Programista tworzy alias typu dla zewnętrznej biblioteki, błędnie sądząc, że można dodać do tego typu własne metody i enkapsulować logikę przejścia.
Plusy:
Minusy:
Zespół tworzy nowy typ na podstawie int dla przedstawienia identyfikatorów użytkowników, aby chronić logikę biznesową przed przypadkowym pomieszaniem z innymi wartościami całkowitymi, i dodaje specjalne metody (walidatory, konwertery).
Plusy:
Minusy: