Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
614 - Telegram Web
Telegram Web
💬 Почему для генерации ключей в Go нельзя использовать math/rand, и как правильно сгенерировать безопасный ключ?

1. Без явного вызова rand.Seed() генератор math/rand всегда возвращает одну и ту же последовательность чисел.
2. Если использовать time.Now().UnixNano() как seed, доступно всего несколько бит энтропии, что делает последовательности легко предсказуемыми.
3. math/rand не подходит для криптографических задач, так как его алгоритм детерминированный и может быть взломан.

crypto/rand Reader — альтернативный вараинт , а если нам нужен текст, можно вывести его в шестнадцатеричном формате или в формате base64:

import (
"crypto/rand"
// "encoding/base64"
// "encoding/hex"
"fmt"
)

func Key() string {
buf := make([]byte, 16)
_, err := rand.Read(buf)
if err != nil {
panic(err) // out of randomness, should never happen
}
return fmt.Sprintf("%x", buf)
// or hex.EncodeToString(buf)
// or base64.StdEncoding.EncodeToString(buf)
}
👍223
💬 Какой подход лучше использовать для объявления пустого среза в Go и почему?

Предпочтительнее использовать var t []string вместо t := []string{}. Первый вариант объявляет срез как nil, в то время как второй вариант создаёт не-nil срез нулевой длины. Они функционально эквивалентны — их len и cap равны нулю, — но стиль с nil-срезом считается предпочтительным.

Важно учитывать, что есть ситуации, когда предпочтителен не-nil срез с нулевой длиной. Например, при кодировании JSON: nil-срез кодируется как null, а []string{} — как пустой JSON-массив [].
👍17
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
👍1
🤔🎄🎁 Какой подарок вы бы хотели на Новый год?

Да, начинать готовиться никогда не рано 😉

#интерактив
🤔1
💬 Почему копирование структур в Go может привести к неожиданным результатам? Приведите пример.

Копирование структур может быть проблематичным, если структура содержит указатели или срезы, которые при копировании продолжают ссылаться на ту же область памяти, что и оригинал. Например, структура bytes.Buffer содержит срез []byte. Если скопировать объект Buffer, методы, вызванные на копии, могут изменять данные в оригинале, так как оба объекта используют одну и ту же память.

package main

import (
"bytes"
"fmt"
)

func main() {
// Создаем оригинальный буфер
original := bytes.Buffer{}
original.WriteString("Hello")

// Копируем буфер
copyBuffer := original

// Добавляем данные в копию
copyBuffer.WriteString(", World!")

// Проверяем содержимое оригинала
fmt.Println(original.String()) // Вывод: "Hello, World!"
}


В этом примере срез []byte в копии copyBuffer ссылается на тот же массив, что и в оригинале original. Поэтому изменения в одном буфере затрагивают другой.
👍13
🦫 Самоучитель по Go для начинающих. Часть 17. Основы сетевого программирования. Стек TCP/IP. Сокеты. Пакет net

В этой части самоучителя мы погрузимся в мир сетевого программирования, изучим его основные концепции и инструменты. Начнем с рассмотрения принципов работы компьютерных сетей и их архитектуры, познакомимся с протоколами TCP и IP, лежащими в основе стека TCP/IP.

Затем детально изучим сокеты и их роль в сетевом взаимодействии. Особое внимание будет уделено пакету net, который предоставляет удобные инструменты для реализации сетевых приложений.

👉 Читать гайд

👩‍💻 Остальные части в серии:

1. Особенности и сфера применения Go, установка, настройка
2. Ресурсы для изучения Go с нуля
3. Организация кода. Пакеты, импорты, модули. Ввод-вывод текста.
4. Переменные. Типы данных и их преобразования. Основные операторы
5. Условные конструкции if-else и switch-case. Цикл for. Вложенные и бесконечные циклы
6. Функции и аргументы. Области видимости. Рекурсия. Defer
7. Массивы и слайсы. Append и сopy. Пакет slices
8. Строки, руны, байты. Пакет strings. Хеш-таблица (map)
9. Структуры и методы. Интерфейсы. Указатели. Основы ООП
10. Введение в ООП. Наследование, абстракция, полиморфизм, инкапсуляция
11. Обработка ошибок. Паника. Восстановление. Логирование
12. Обобщенное программирование. Дженерики
13. Работа с датой и временем. Пакет time
14. Интерфейсы ввода-вывода. Буферизация. Работа с файлами. Пакеты io, bufio, os
15. Конкурентность. Горутины. Каналы
16. Тестирование кода и его виды. Table-driven подход. Параллельные тесты
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
👨‍💻🚀 Тест: насколько ты продвинутый разраб?

Говорят, что джун становится мидлом, когда начинает понимать, как мало он знает. Этот тест покажет, насколько ты продвинулся в своём развитии.

👉 Ворваться
🤩1
💬 Почему добавление элементов в nil-срез работает, а добавление в nil-мапу вызывает панику?

В Go срезы и тип map работают по-разному:

1. Срезы:
🔸 nil-срез — это валидный срез с нулевой длиной (len == 0) и нулевой ёмкостью (cap == 0).
🔸 Когда мы вызываем append() на nil-срезе, Go выделяет новую память и создаёт срез с достаточной ёмкостью для хранения новых элементов. Поэтому добавление элементов в nil-срез работает без ошибок.

Пример:
var a []int
a = append(a, 4, 5, 6) // Создаётся новый срез в памяти
fmt.Println(a) // [4 5 6]


2. Тип map
🔸 nil-мапа неинициализирована и не имеет памяти для хранения пар ключ-значение.
🔸 Любая попытка добавить элемент в nil-мапу вызовет панику, так как мапа не готова к использованию.
🔸 Для работы с мапой её нужно явно инициализировать с помощью функции make.

Пример:
var m map[int]int
// m[1] = 1 // Вызовет панику
m = make(map[int]int)
m[1] = 1 // Теперь работает
👍142
Как избежать состояния гонки?

Используйте мьютексы (sync.Mutex):
Мьютекс блокирует доступ к ресурсу, пока горутина не освободит его.
Пример:
gopackage main
import (
«fmt»
«sync»
)
var counter int
var mu sync.Mutex
func increment(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 1000; i++ {
mu.Lock() // Блокируем доступ
counter++
mu.Unlock() // Освобождаем доступ
}
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
go increment(&wg)
go increment(&wg)
wg.Wait()
fmt.Println(«Counter:», counter) // Правильное значение}


Используйте каналы для синхронизации:
Каналы позволяют передавать данные между горутинами, избегая прямого доступа к разделяемой памяти.
Пример:
gopackage main
import «fmt»
func main() {
ch := make(chan int)
go func() {
sum := 0
for i := 0; i < 1000; i++ {
sum++
}
ch <- sum
}()
result := <-ch
fmt.Println(«Result:», result) // Гарантированно корректное значение}

Используйте атомарные операции (sync/atomic):
Для операций инкремента, декремента и чтения/записи целых чисел используйте пакет sync/atomic.
Пример:
gopackage main
import ( «fmt» «sync» «sync/atomic»)

var counter int64
func increment(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 1000; i++ {
atomic.AddInt64(&counter, 1) // Атомарное увеличение
}
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
go increment(&wg)
go increment(&wg)
wg.Wait()
fmt.Println(«Counter:», counter) // Корректное значение}

Минимизируйте разделяемое состояние:
Старайтесь проектировать программу так, чтобы каждая горутина работала с собственными данными. Это снижает вероятность состояния гонки.

Используйте инструменты для обнаружения состояния гонки:
Go предоставляет встроенный инструмент -race для выявления состояния гонки.
Пример запуска:
go run -race main.go


Понимайте порядок работы горутин:
Горутины не гарантируют порядок выполнения. Используйте механизмы синхронизации (sync.WaitGroup, каналы) для управления их завершением.
👍11
Черные скидки на курсы в Академии!

-40% до конца ноября

🔥 В честь Черной пятницы до 30 ноября запускаем распродажу на все курсы proglib.academy и дарим промокод на сумму 10 000 на технику в магазине DigitalRazor (отправим вам по запросу)

🎁 Анонс новогоднего сюрприза!

🎄 Те, кто успеет приобрести курсы с 27 ноября по 27 декабря, получат шанс выиграть крутой новогодний подарок.
Что это будет, пока держим в секрете – следите за новостями на нашем канале!

Почему стоит выбрать нас?

⚫️ Опытные преподаватели
Вас будут обучать доценты ВМК МГУ по математике, а алгоритмы расскажет разработчик из Яндекса и преподаватель МФТИ и НИУ ВШЭ.

⚫️ Бессрочный доступ ко всем курсам
Проходите обучение в удобном для вас темпе, без давления жестких сроков.

⚫️ Поддержка преподавателей
Не останетесь одни — вам всегда помогут разобраться с трудными темами и ответят на любые вопросы через чат и платформу Coreapp.

👉 Не уверены, подойдет ли вам курс? Начните с бесплатных вводных занятий и познакомьтесь с преподавателями и форматом обучения –

Ждем вас на обучении! 🙌
👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Лучшие ресурсы, чтобы не отставать от трендов из мира Go.

👣 Golang Go - авторский канал, посвященный Go разработке, Devops и созданию высоконагруженных сервисов.

📚 Golang books редкая литература , статьи, курсы и уникальные гайды для Golang специалистов любого уровня. Читайте, развивайтесь, практикуйте.

💼 Golang Jobs — актуальные предложения для Golang разработчиков от самых крупных работодателей и лидеров рынка.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🥰2🤩2
Как используется оператор select в Go?

Оператор select в Go используется для работы с несколькими каналами одновременно. Это позволяет горутине ожидать события на нескольких каналах и блокировать выполнение до тех пор, пока не произойдёт одно из событий (например, получение данных с канала).

🛠 select работает подобно конструкции switch, но вместо проверки значений переменных, она проверяет операции с каналами. Когда одна из операций с каналом завершается, выполняется соответствующий блок кода.
🔥6👍5
This media is not supported in your browser
VIEW IN TELEGRAM
⚡️ Напоминаем: у нас можно (и нужно) купить рекламу

→ Более 60 телеграм-каналов по всем направлениям IT
→ Почти 1,2 миллиона аудитории
→ Собственное медиа и сайт с DAU 25 000 — можем усилить продвижение
→ Классные email-рассылки
→ И, конечно же, крутые контент-менеджеры, которые сделают нативную интеграцию/придумают виральный пост/реализуют любые контентные предпочтения

Для заказа пишите сюда: @proglib_adv
👍1
Как форматировать исходный код на Go идиоматично?

Идиоматичный Go-код — это код, написанный в соответствии с общепринятыми стилевыми и архитектурными стандартами языка Go, отражающий лучшие практики и философию языка.

🎯 Идиоматичное форматирование Go-кода достигается с помощью встроенного инструмента gofmt, который автоматически приводит код к стандартному стилю, обеспечивая консистентность отступов и пробелов. Рекомендуется использовать goimports для управления импортами, автоматически добавляя или удаляя их по необходимости. Интеграция этих инструментов в редакторы кода, такие как VS Code или GoLand, позволяет автоматически форматировать код при сохранении.
🥱7👏4👍1😢1
🎉 Розыгрыш от Proglib Academy и DigitalRazor!

С 27 ноября по 27 декабря у вас есть шанс не только прокачать свои навыки, но и выиграть ПК при покупке любого курса Академии!

🎁 Призы для участников акции:

Игровой ПК DigitalRazor ProGaming
VIP-пакет курса Proglib Academy

💡 Как принять участие?
Купите любой курс Proglib Academy с 27 ноября по 27 декабря и получите шанс выиграть мощный ПК.

Приобретите технику DigitalRazor — участвуйте в розыгрыше VIP курса.

📅 Вместе с DigitalRazor мы создали спецпредложение -50% на курсы до 30 ноября, чтобы вы могли начать обучение на более выгодных условиях.

Выбрать курс
Что такое «goroutine leak», как его можно предотвратить и как диагностировать такие утечки?

goroutine leak — это ситуация, когда горутина продолжает работать, несмотря на то, что её задача завершена или больше не актуальна, что приводит к утечке памяти и ресурсов. Это может произойти, если горутина ждет на канале, блокируется или не завершает свою работу должным образом.

Причины утечек горутин:

🎯 Горутину, которая ждет данных из канала, нельзя завершить, если канал не закрыт.
🎯 Если горутина застревает в select или for без выхода, например, в ожидании данных из канала, который больше не отправляет значения.
🎯 Если горутина не проверяет context.Done() для завершения, она может продолжать работать, даже если операция больше не нужна.

Как предотвратить:
Использование контекста (context) для отмены длительных операций. Важно проверять context.Done() для своевременного завершения работы горутины.
Закрытие каналов, когда больше не требуется передавать данные, чтобы все горутины, ожидающие на этом канале, могли завершиться.
Обработка ошибок и гарантии выхода из блокирующих операций в случае ошибок или таймаутов.

Как диагностировать:
🛠️ Профилирование с помощью pprof: инструмент позволяет отслеживать активные горутины и выявлять утечки.
🛠️ Тестирование на гонки: использование команды go test -race помогает обнаружить ошибки синхронизации, которые могут привести к утечкам.
🛠️Мониторинг горутин: с помощью логирования или специфичных инструментов (например, Go-Routine Inspector) можно отслеживать, какие горутины остаются активными.
👍9
Что такое пустой интерфейс в Go? Когда его лучше использовать и когда не стоит?

«Empty interface» в Go ( interface{} ) — это интерфейс, не имеющий методов. Поскольку все типы реализуют пустой интерфейс, его можно использовать для хранения значений любых типов.

Когда использовать:
Когда нужно хранить объекты разных типов, например, в коллекциях (срезах или мапах).
Для обработки данных, тип которых заранее неизвестен, например, при работе с JSON или при передаче произвольных данных в функции.
Когда функция должна принимать различные типы данных.

Когда не использовать:
Использование скрывает типы и может привести к ошибкам на этапе выполнения. Лучше использовать конкретные типы, когда это возможно.
Преобразование типов из может быть затратным, что важно учитывать в производительных системах.
👍7
Что такое nil ошибка в Go и как её правильно обрабатывать?

Если ошибка равна nil, это означает, что операция была успешной, и можно продолжать использовать возвращённые данные. Правильная обработка nil ошибки заключается в явной проверке каждого возвращаемого значения ошибки и принятии мер в зависимости от того, является ли ошибка nil или нет.
🥱18👍7😁2👾1
В чем отличие между каналами, которые буферизуются, и небуферизованными каналами в Go?

Небуферизованный канал не хранит данные. Это значит, что операция записи в канал блокирует отправителя до тех пор, пока другой горутина не примет эти данные из канала.

Буферизованный канал имеет фиксированный размер буфера, в который можно помещать несколько элементов до того, как получатель начнёт забирать данные. Запись в канал не блокирует отправителя, если есть свободное место в буфере. Блокировка произойдёт только, если буфер заполнен.
👍12
Почему в проектах на Go разработчики часто предпочитают использовать сторонние библиотеки для логирования, такие как zap или logrus, вместо стандартного пакета log?

Они поддерживают уровни логирования (DEBUG, INFO, WARN, ERROR), что позволяет более гибко управлять выводом сообщений в зависимости от окружения. Кроме того, они предоставляют структурированное логирование, где сообщения представляют собой набор ключей и значений.
Например, лог в JSON вместо строки:
{«level»: «info», «message»: «User logged in», «user_id»: 123 }

Это особенно полезно для автоматической обработки логов в системах мониторинга, таких как ELK или Loki.
Стандартный пакет чаще всего используется для простых скриптов и CLI-приложений. Для высоконагруженных, сложных или больших приложений лучшим выбором будут сторонние библиотеки.
👍15🤔3👾3🌚1
2025/07/09 19:01:41
Back to Top
HTML Embed Code: