Historia pytania:
Pojawienie się aliasów typów (type alias) w Go jest związane z koniecznością zapewnienia płynniejszego przejścia między wersjami API, kiedy typ zmienia pakiet. Do Go 1.9 używano tylko deklaracji nowych typów, teraz wspierane są również aliasy typów.
Problem:
Wielu ludzi myli aliasy z nowymi typami — błędnie uważa, że są one identyczne, co prowadzi do błędów przy konwersji, metodach, przesyłaniu do interfejsów.
Rozwiązanie:
Alias typu tworzy alternatywną nazwę dla istniejącego typu, podczas gdy deklared nowego typu - to tworzenie nowego unikalnego typu na podstawie istniejącego. Alias pozwala zachować zgodność wsteczną i integrować stare i nowe typy bez konwersji.
Przykład kodu:
// Nowy typ type MyString string // Alias typu type MyStringAlias = string
Kluczowe cechy:
Czy można dodać metody do typu przez alias?
Nie, metody można dodawać tylko do nowych typów, a alias to nie nowy typ, to to samo co typ źródłowy.
type Alias = int // func (a Alias) Method() {} // błąd!
Jaka jest różnica w porównaniu typów alias i nowego typu?
Alias jest porównywalny z typem bazowym i przyjmuje jego wartość bez konwersji. Nowy typ nie jest kompatybilny, nawet jeśli opiera się na tym samym typie.
type T1 = int var a T1 = 10 // ok var b int = a // ok type T2 int var c T2 = 10 // var d int = c // błąd kompilacji
Kiedy alias jest lepszy niż nowy typ?
Kiedy wymagana jest ponowna eksportacja typu między pakietami lub zapewnienie przejrzystej migracji API bez rekompilacji kodu klientów. Na przykład:
type OldType = NewType // alias jest wygodniejszy w utrzymaniu starych wersji API
W projekcie zmieniają nazwę typu za pomocą nowego typu, a nie aliasu, co łamie zgodność.
type OldType int
Zalety:
Wady:
Użyto aliasu typu do przejrzystej migracji API.
type OldType = NewType
Zalety:
Wady: