Middle — Senior
Czy możesz podać przykłady rozwiązań architektonicznych, które okazały się błędne lub nieefektywne, i wyjaśnić dlaczego?
sobes.tech AI
Odpowiedź od AI
Niepoprawne lub nieefektywne rozwiązania architektoniczne w Go często wiążą się z niewłaściwym stosowaniem zasad języka i wzorców:
- Zbyt duża monolityczna struktura. Gdy cały kod jest skupiony w jednym pakiecie lub pliku, utrudnia to utrzymanie i testowanie.
- Brak interfejsów do abstrakcji. W Go interfejsy umożliwiają łatwą wymianę implementacji, ale jeśli ich nie używamy, kod staje się sztywny.
- Użycie zmiennych globalnych do przechowywania stanu. Prowadzi to do problemów z konkurencyjnością i testami.
- Nieprawidłowe zarządzanie gorutynami. Na przykład uruchamianie gorutyn bez kontroli ich zakończenia lub bez kontekstu, co powoduje wycieki zasobów.
- Nadmierne użycie kanałów tam, gdzie wystarczą proste funkcje. Kanały są dobre do synchronizacji, ale ich niewłaściwe użycie komplikuje kod.
Przykład złego rozwiązania — uruchomienie gorutiny bez kontekstu i kontroli:
func process() {
go func() {
// nieskończona pętla bez możliwości zatrzymania
for {
// praca
}
}()
}
Lepszym rozwiązaniem jest użycie kontekstu do anulowania:
func process(ctx context.Context) {
go func() {
for {
select {
case <-ctx.Done():
return
default:
// praca
}
}
}()
}