@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Distributed tracing в Go
Представьте, что у вас есть цепочка сервисов, которые взаимодействуют друг с другом.
И, например, запрос от одного к другому длится очень долго. Как быстро найти проблему?
Здесь поможет distributed tracing. Вы сможете визуализировать полный путь запроса через все системы, что ускорит поиск проблемы.
Об инструментах трейсинга в Go, их плюсах и минусах рассказал Константин Гвенцадзе, разработчик из отдела развития услуг 1С в @selectelcareers 🦖
А еще он подготовил для вас репозиторий с инструкциями и командами, чтобы вы могли потестить и выбрать для себя подходящий инструмент!
Кстати, в Selectel сейчас открыто несколько интересных вакансий в Backend-разработку на Golang — заглядывайте посмотреть 😉
Реклама, АО «Селектел», ИНН: 7810962785, ERID: 2VtzqwWKz2a
Представьте, что у вас есть цепочка сервисов, которые взаимодействуют друг с другом.
И, например, запрос от одного к другому длится очень долго. Как быстро найти проблему?
Здесь поможет distributed tracing. Вы сможете визуализировать полный путь запроса через все системы, что ускорит поиск проблемы.
Об инструментах трейсинга в Go, их плюсах и минусах рассказал Константин Гвенцадзе, разработчик из отдела развития услуг 1С в @selectelcareers 🦖
А еще он подготовил для вас репозиторий с инструкциями и командами, чтобы вы могли потестить и выбрать для себя подходящий инструмент!
Кстати, в Selectel сейчас открыто несколько интересных вакансий в Backend-разработку на Golang — заглядывайте посмотреть 😉
Реклама, АО «Селектел», ИНН: 7810962785, ERID: 2VtzqwWKz2a
@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Golang
@devopsitsec
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Представляем вам крутую шпаргалку по шести основным архитектурным шаблонам, каждый из которых подходит для разных сценариев.
Это самый простой и традиционный подход, при котором все компоненты связаны между собой в единой кодовой базе. Монолитная архитектура проста и идеально подходит для небольших приложений, не требующих обширной масштабируемости. Однако по мере роста систем ее масштабирование, тестирование и поддержка могут стать сложными. Идеально подходит для стартапов или небольших команд, ищущих быструю разработку.
Любимый вариант для больших сложных приложений, которым требуется масштабируемость и гибкость. Здесь приложение разделено на независимо развертываемые сервисы, каждый из которых обрабатывает определенные бизнес-функции. Микросервисы позволяют командам использовать различные технологические стеки и масштабировать сервисы независимо. Этот шаблон популярен в приложениях с высоким трафиком и организациях, которым нужна свобода для независимого развертывания функций.
Этот шаблон разделяет задачи на контроллеры и рабочие. Контроллер управляет взаимодействиями с пользователем, в то время как рабочие выполняют фоновые задачи, такие как обработка данных, создавая систему, которая является высокомасштабируемой и эффективной. Идеально подходит для приложений, которым необходимо выполнять интенсивные фоновые задания, такие как обработка заказов, аналитика в реальном времени или уведомления.
Классический шаблон, обычно используемый в веб-приложениях, MVC разделяет логику приложения (модель), пользовательский интерфейс (представление) и взаимодействие (контроллер). Такое разделение задач упрощает поддержку и обновление определенных частей, не затрагивая всю систему. MVC является популярным выбором для приложений, которым требуются пользовательские интерфейсы, особенно в сферах электронной коммерции и управления контентом.
Идеально подходит для систем, которым необходимо реагировать на определенные действия или события, такие как щелчки пользователя, обновления базы данных или показания датчиков. В этом шаблоне компоненты реагируют на события асинхронно, что делает его масштабируемым и слабосвязанным. Архитектура, управляемая событиями, отлично подходит для приложений со сложными рабочими процессами или асинхронными потребностями в обработке, такими как IoT, аналитика в реальном времени и системы уведомлений клиентов.
Организует приложение по слоям (Презентация, Бизнес, Доступ к данным и Инфраструктура) для создания четкого разделения интересов. Каждый слой отвечает за определенный аспект, делая систему более обслуживаемой и тестируемой. Многоуровневый подход часто используется в корпоративных приложениях и идеально подходит для создания четкой стандартизированной структуры во всей системе.
#doc #web #cheatsheet
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
В этой задаче Вам необходимо найти самую длинную подстроку строки \(s\), такую что каждая буква в ней встречается не менее \(k\) раз.
Если такой подстроки нет, вернуть 0.
Пример:
Вход: s = "aaabb", k = 3
Выход: 3
Объяснение: Самая длинная подходящая подстрока – "aaa", так как буква 'a' повторяется три раза.
### Описание алгоритма:
1. Генерация подстрок: Генерируем все возможные подстроки строки \(s\). Для каждой подстроки будем отслеживать частоту появления символов при помощи массива countMap.
2. Проверка валидности: Метод isValid проверяет, что каждый символ в текущей подстроке появляется хотя бы \(k\) раз. Это делается через проверку значений в массиве countMap. Если все символы удовлетворяют условию, то подстрока считается допустимой.
3. Обновление результата: Отслеживаем максимальную длину допустимых подстрок. Когда находим новую подходящую подстроку большей длины, обновляем результат. В итоге возвращаем длину самой длинной найденной подстроки.
Ответ:
package main
import (
"fmt"
)
func longestSubstring(s string, k int) int {
if len(s) == 0 || k > len(s) {
return 0
}
n := len(s)
result := 0
for start := 0; start < n; start++ {
countMap := make([]int, 26)
for end := start; end < n; end++ {
countMap[s[end]-'a']++
if isValid(countMap, k) {
if end-start+1 > result {
result = end - start + 1
}
}
}
}
return result
}
func isValid(countMap []int, k int) bool {
countLetters, countAtLeastK := 0, 0
for _, count := range countMap {
if count > 0 {
countLetters++
}
if count >= k {
countAtLeastK++
}
}
return countLetters == countAtLeastK
}
func main() {
fmt.Println(longestSubstring("aaabb", 3)) // Output: 3
fmt.Println(longestSubstring("ababbc", 2)) // Output: 5
}
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM