Если вы работаете с языком Go и уверены в своих знаниях — самое время это проверить.
Это мини-экзамен перед собеседованием: синтаксис, тонкости работы с горутинами, ошибки, которые делают даже опытные разработчики.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Затенение
var x int = 10 // глобальная переменная
func main() {
x := 20 // локальная переменная, затеняющая глобальную
fmt.Println(x) // Выведет 20, потому что локальная переменная затеняет глобальную
}
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Принцип идентификации ресурсов в REST означает
Для работы с
• /users
• /users/123
Please open Telegram to view this post
VIEW IN TELEGRAM
Это свойство гарантирует
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Библиотека девопса | DevOps, SRE, Sysadmin
🤦♂️ Я забил на споры о микросервисах с архитекторами, и вот почему
С момента появления концепции микросервисов прошло уже несколько лет. За это время появилось много споров о её эффективности.
Зачем спорить о микросервисах, если можно просто посмотреть на факты? Давайте разберёмся, что действительно важно
➡️ Читать статью
💬 Как вы относитесь к микросервисам? Использовали ли вы их в своих проектах? Ждём ваши комментарии 👇
🐸 Библиотека devops'a
С момента появления концепции микросервисов прошло уже несколько лет. За это время появилось много споров о её эффективности.
Зачем спорить о микросервисах, если можно просто посмотреть на факты? Давайте разберёмся, что действительно важно
Please open Telegram to view this post
VIEW IN TELEGRAM
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