Sobes.tech
Middle — Senior

Можете ли да дадете примери за архитектурни решения, които се оказаха грешни или неефективни, и да обясните защо?

sobes.tech AI

Отговор от AI

Грешните или неефективни архитектурни решения в Go често са свързани с неправилното прилагане на принципите на езика и моделите:

  • Много голяма монолитна структура. Когато целият код е концентриран в един пакет или файл, това усложнява поддръжката и тестването.
  • Липса на интерфейси за абстракции. В Go интерфейсите позволяват лесна замяна на реализации, но ако не се използват, кодът става твърд.
  • Използване на глобални променливи за състояние. Това води до проблеми с конкуренцията и тестовете.
  • Неправилно управление на горутините. Например, стартиране на горутини без контрол върху тяхното приключване или без контекст, което води до изтичане на ресурси.
  • Прекалено използване на канали там, където са достатъчни прости функции. Каналите са добри за синхронизация, но неправилната им употреба усложнява кода.

Пример за лошо решение — стартиране на горутина без контекст и контрол:

func process() {
    go func() {
        // безкраен цикъл без възможност за спиране
        for {
            // работа
        }
    }()
}

По-добре е да се използва контекст за анулиране:

func process(ctx context.Context) {
    go func() {
        for {
            select {
            case <-ctx.Done():
                return
            default:
                // работа
            }
        }
    }()
}