context.WithCancel
, но не вызвать cancel()
Контекст
Please open Telegram to view this post
VIEW IN TELEGRAM
Durability гарантирует, что данные,
Это означает, что после того как транзакция
Please open Telegram to view this post
VIEW IN TELEGRAM
📦 Главные проблемы распределенных систем (и способы их решения)
Распределенные системы являются основой высоконагруженных веб-приложений, обеспечивая их масштабируемость, отказоустойчивость и высокую производительность. Однако их разработка сопряжена с рядом сложностей, включая сетевые сбои, трудности координации, угрозы безопасности и проблемы масштабирования.
➡️ В этой статье мы рассмотрим четыре ключевых вызова в разработке таких систем и эффективные методы их преодоления.
🐸 Библиотека программиста
Распределенные системы являются основой высоконагруженных веб-приложений, обеспечивая их масштабируемость, отказоустойчивость и высокую производительность. Однако их разработка сопряжена с рядом сложностей, включая сетевые сбои, трудности координации, угрозы безопасности и проблемы масштабирования.
Please open Telegram to view this post
VIEW IN TELEGRAM
Коллизия хэш-функции
Please open Telegram to view this post
VIEW IN TELEGRAM
❓ Как вам задачи прошедшей недели
Anonymous Poll
11%
😣 Сложновато
45%
👍 В самый раз
44%
👀 Надо бы сложнее
Чтобы избежать гонок при работе с слайсами, необходимо использовать механизмы синхронизации, такие как мьютексы (sync.Mutex или sync.RWMutex) или каналы для передачи копий данных между горутинами. Важно предотвратить одновременное изменение и чтение слайса, чтобы избежать неожиданных ошибок.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Принципы саги:
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Пример:
var ptr *int // указатель на int
Если у нас есть переменная типа *int, то её значение — это адрес в памяти, где хранится переменная типа int. Чтобы получить доступ к значению по этому адресу, нужно использовать оператор разыменования (тоже звёздочку):
var a int = 58
var ptr *int = &a // ptr теперь указывает на a
fmt.Println(*ptr) // выводит 58
Таким образом, звёздочка перед типом указывает на то, что переменная хранит не само значение, а ссылку на него. Это важно для работы с памятью, передачи данных без копирования и работы с большими структурами или массивами, чтобы не тратить ресурсы на их копирование.
Please open Telegram to view this post
VIEW IN TELEGRAM
Основные принципы включают:
1. Разделение конфигурации – конфигурация должна быть отдельной от кода (например, через переменные окружения).
2. Кодовая база – приложение должно иметь единую кодовую базу, которая управляется с помощью системы контроля версий.
3. Поддержка нескольких сред – приложение должно работать в различных средах (разработка, тестирование, продакшн) с минимальными изменениями в коде.
4. Обработка зависимостей – все зависимости должны быть явно заявлены в коде и управляться через зависимости, такие как go.mod для Go.
5. Сборка, релиз, выполнение – процесс развертывания приложения должен быть разделён на стадии сборки, релиза и выполнения.
6. Отслеживание состояния – приложение должно минимизировать зависимость от состояния, хранимого на сервере, и использовать внешние системы хранения состояния.
Please open Telegram to view this post
VIEW IN TELEGRAM
8. Конкурентность – приложение должно быть масштабируемым и поддерживать параллельное выполнение с использованием процессов.
9. Обработка ошибок – ошибки должны быть обрабатываться через логи, а не через сложные механизмы восстановления состояния.
10. Репликация процессов – приложение должно поддерживать репликацию процессов, чтобы обеспечивать отказоустойчивость.
11. Документация – необходимо поддерживать документацию для быстрого развертывания приложения.
12. Тестирование и производство – код должен быть готов к тестированию и запуску на производстве с минимальными усилиями.
Please open Telegram to view this post
VIEW IN TELEGRAM
Для улучшения производительности в случае частых склеиваний рекомендуется использовать strings.Builder, который оптимизирует процесс и минимизирует лишние аллокации.
Пример с strings.Builder:
var builder strings.Builder
for i := 0; i < 1000; i++ {
builder.WriteString("x")
}
result := builder.String()
Это значительно эффективнее, чем использование оператора «+» в цикле.
Please open Telegram to view this post
VIEW IN TELEGRAM
В Go для работы со строками используются следующие подходы:
1. Конкатенация: Строки можно склеивать с помощью оператора +, но это неэффективно при многократных операциях.
s := "Hello, " + "world!"
import "strings"
lower := strings.ToLower("HELLO") // "hello"
var builder strings.Builder
builder.WriteString("Hello")
result := builder.String() // "Hello"
b := []byte("Hello")
b[0] = 'h'
newStr := string(b) // "hello"
Please open Telegram to view this post
VIEW IN TELEGRAM
1. Преобразование строки в целое число:
Для того, чтобы преобразовать строку в целое число, используется функция strconv.Atoi или strconv.ParseInt.
import "strconv"
str := "123"
num, err := strconv.Atoi(str) // преобразует строку в int
if err != nil {
// обработка ошибки
}
2. Преобразование целого числа в строку:
Для преобразования числа в строку используется функция strconv.Itoa.
import "strconv"
num := 123
str := strconv.Itoa(num) // преобразует int в строку
Кратко:
Нельзя напрямую использовать int(string) или string(int) в Go.
Для преобразования строки в число используем strconv.Atoi или strconv.ParseInt.
Для преобразования числа в строку используем strconv.Itoa.
Please open Telegram to view this post
VIEW IN TELEGRAM
Следить за временем жизни горутины
Основной инструмент для управления
Также можно использовать каналы управления вручную, передавая в горутину канал stop или done, и завершать её при получении сигнала. Такой способ полезен, если не требуется гибкость context, но нужно просто и понятно управлять остановкой.
Please open Telegram to view this post
VIEW IN TELEGRAM
Если нужно
Если же объект простой
Please open Telegram to view this post
VIEW IN TELEGRAM
replace
, exclude
и require
в go.mod?require —
replace —
exclude —
Please open Telegram to view this post
VIEW IN TELEGRAM
Статическая компиляция в Go — это процесс
Иными словами:
Please open Telegram to view this post
VIEW IN TELEGRAM
Этот паттерн называется
Please open Telegram to view this post
VIEW IN TELEGRAM
Библиотека Go для собеса | вопросы с собеседований
Признаёмся, взяли вопрос без корректировок с одного из интервью 👀
В хорошем собеседовании интервьюер не просто задаёт вопросы, но и даёт фидбек по ответу и даже может объяснить концепцию которую он спросил.
Человеческий фактор не исключение, поэтому советуем уточнять что имеет в виду человек по ту сторону интервью.
Пример для вопроса про адаптер
🐸 Библиотека Go для собеса
В хорошем собеседовании интервьюер не просто задаёт вопросы, но и даёт фидбек по ответу и даже может объяснить концепцию которую он спросил.
Человеческий фактор не исключение, поэтому советуем уточнять что имеет в виду человек по ту сторону интервью.
Пример для вопроса про адаптер
// Target - интерфейс, который ожидает клиент
type Target interface {
Request() string
}
// Adaptee - устаревший класс, который не соответствует интерфейсу Target
type Adaptee struct{}
func (a *Adaptee) SpecificRequest() string {
return "Специфический запрос из Adaptee"
}
// Adapter - адаптирует интерфейс Adaptee к интерфейсу Target
type Adapter struct {
adaptee *Adaptee
}
func (a *Adapter) Request() string {
// Адаптируем специфический запрос Adaptee к формату, который ожидает Target
return a.adaptee.SpecificRequest()
}
Please open Telegram to view this post
VIEW IN TELEGRAM