💬 Как интерфейс
Интерфейс
🔸 Если источник реализует
🔸 Если получатель реализует
🔸 Если ни один из интерфейсов не реализован, используется внутренний буфер (по умолчанию 32 КБ).
Этот механизм позволяет сократить количество операций копирования и ускорить передачу данных, особенно для оптимизированных системных вызовов, таких как
io.WriterTo
оптимизирует передачу данных в Go и как io.Copy()
решает, какой метод использовать?Интерфейс
io.WriterTo
позволяет объекту-источнику напрямую записывать данные в объект-получатель через метод WriteTo(w Writer)
. Это устраняет необходимость промежуточного буфера, делая передачу данных более эффективной.io.Copy()
проверяет, реализует ли объект-источник интерфейс WriterTo
или объект-получатель интерфейс ReaderFrom
:🔸 Если источник реализует
WriterTo
, вызывается WriteTo()
.🔸 Если получатель реализует
ReaderFrom
, вызывается ReadFrom()
.🔸 Если ни один из интерфейсов не реализован, используется внутренний буфер (по умолчанию 32 КБ).
Этот механизм позволяет сократить количество операций копирования и ускорить передачу данных, особенно для оптимизированных системных вызовов, таких как
sendfile
в Linux.👍10
💬 Почему для генерации ключей в Go нельзя использовать
1. Без явного вызова
2. Если использовать
3.
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)
}
👍22❤3
💬 Какой подход лучше использовать для объявления пустого среза в Go и почему?
Предпочтительнее использовать
Важно учитывать, что есть ситуации, когда предпочтителен не-nil срез с нулевой длиной. Например, при кодировании JSON: nil-срез кодируется как null, а
Предпочтительнее использовать
var t []string
вместо t := []string{}
. Первый вариант объявляет срез как nil, в то время как второй вариант создаёт не-nil срез нулевой длины. Они функционально эквивалентны — их len и cap равны нулю, — но стиль с nil-срезом считается предпочтительным.Важно учитывать, что есть ситуации, когда предпочтителен не-nil срез с нулевой длиной. Например, при кодировании JSON: nil-срез кодируется как null, а
[]string{}
— как пустой JSON-массив []
.👍17
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
👍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
Forwarded from Библиотека Go-разработчика | Golang
🦫 Самоучитель по 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 подход. Параллельные тесты
В этой части самоучителя мы погрузимся в мир сетевого программирования, изучим его основные концепции и инструменты. Начнем с рассмотрения принципов работы компьютерных сетей и их архитектуры, познакомимся с протоколами 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. Срезы:
🔸
🔸 Когда мы вызываем
Пример:
2. Тип map
🔸
🔸 Любая попытка добавить элемент в
🔸 Для работы с мапой её нужно явно инициализировать с помощью функции
Пример:
В 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 // Теперь работает
👍14❤2
❓Как избежать состояния гонки?
✅Используйте мьютексы (sync.Mutex):
Мьютекс блокирует доступ к ресурсу, пока горутина не освободит его.
Пример:
✅Используйте каналы для синхронизации:
Каналы позволяют передавать данные между горутинами, избегая прямого доступа к разделяемой памяти.
Пример:
✅Используйте атомарные операции (sync/atomic):
Для операций инкремента, декремента и чтения/записи целых чисел используйте пакет sync/atomic.
Пример:
✅Минимизируйте разделяемое состояние:
Старайтесь проектировать программу так, чтобы каждая горутина работала с собственными данными. Это снижает вероятность состояния гонки.
Используйте инструменты для обнаружения состояния гонки:
✅ Go предоставляет встроенный инструмент -race для выявления состояния гонки.
Пример запуска:
✅ Понимайте порядок работы горутин:
Горутины не гарантируют порядок выполнения. Используйте механизмы синхронизации (sync.WaitGroup, каналы) для управления их завершением.
✅Используйте мьютексы (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.
👉 Не уверены, подойдет ли вам курс? Начните с бесплатных вводных занятий и познакомьтесь с преподавателями и форматом обучения –
Ждем вас на обучении! 🙌
-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, но вместо проверки значений переменных, она проверяет операции с каналами. Когда одна из операций с каналом завершается, выполняется соответствующий блок кода.
✅ Оператор 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
→ Более 60 телеграм-каналов по всем направлениям IT
→ Почти 1,2 миллиона аудитории
→ Собственное медиа и сайт с DAU 25 000 — можем усилить продвижение
→ Классные email-рассылки
→ И, конечно же, крутые контент-менеджеры, которые сделают нативную интеграцию/придумают виральный пост/реализуют любые контентные предпочтения
Для заказа пишите сюда: @proglib_adv
👍1
❓ Как форматировать исходный код на Go идиоматично?
Идиоматичный Go-код — это код, написанный в соответствии с общепринятыми стилевыми и архитектурными стандартами языка Go, отражающий лучшие практики и философию языка.
🎯 Идиоматичное форматирование Go-кода достигается с помощью встроенного инструмента gofmt, который автоматически приводит код к стандартному стилю, обеспечивая консистентность отступов и пробелов. Рекомендуется использовать goimports для управления импортами, автоматически добавляя или удаляя их по необходимости. Интеграция этих инструментов в редакторы кода, такие как VS Code или GoLand, позволяет автоматически форматировать код при сохранении.
Идиоматичный 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 ноября, чтобы вы могли начать обучение на более выгодных условиях.
Выбрать курс
С 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) можно отслеживать, какие горутины остаются активными.
❗goroutine leak — это ситуация, когда горутина продолжает работать, несмотря на то, что её задача завершена или больше не актуальна, что приводит к утечке памяти и ресурсов. Это может произойти, если горутина ждет на канале, блокируется или не завершает свою работу должным образом.
Причины утечек горутин:
🎯 Горутину, которая ждет данных из канала, нельзя завершить, если канал не закрыт.
🎯 Если горутина застревает в select или for без выхода, например, в ожидании данных из канала, который больше не отправляет значения.
🎯 Если горутина не проверяет context.Done() для завершения, она может продолжать работать, даже если операция больше не нужна.
Как предотвратить:
❗Использование контекста (context) для отмены длительных операций. Важно проверять context.Done() для своевременного завершения работы горутины.
❗Закрытие каналов, когда больше не требуется передавать данные, чтобы все горутины, ожидающие на этом канале, могли завершиться.
❗Обработка ошибок и гарантии выхода из блокирующих операций в случае ошибок или таймаутов.
Как диагностировать:
🛠️ Профилирование с помощью pprof: инструмент позволяет отслеживать активные горутины и выявлять утечки.
🛠️ Тестирование на гонки: использование команды go test -race помогает обнаружить ошибки синхронизации, которые могут привести к утечкам.
🛠️Мониторинг горутин: с помощью логирования или специфичных инструментов (например, Go-Routine Inspector) можно отслеживать, какие горутины остаются активными.
👍9
❓Что такое пустой интерфейс в Go? Когда его лучше использовать и когда не стоит?
«Empty interface» в Go ( interface{} ) — это интерфейс, не имеющий методов. Поскольку все типы реализуют пустой интерфейс, его можно использовать для хранения значений любых типов.
Когда использовать:
✅ Когда нужно хранить объекты разных типов, например, в коллекциях (срезах или мапах).
✅ Для обработки данных, тип которых заранее неизвестен, например, при работе с JSON или при передаче произвольных данных в функции.
✅ Когда функция должна принимать различные типы данных.
Когда не использовать:
❗ Использование скрывает типы и может привести к ошибкам на этапе выполнения. Лучше использовать конкретные типы, когда это возможно.
❗ Преобразование типов из может быть затратным, что важно учитывать в производительных системах.
«Empty interface» в Go ( interface{} ) — это интерфейс, не имеющий методов. Поскольку все типы реализуют пустой интерфейс, его можно использовать для хранения значений любых типов.
Когда использовать:
✅ Когда нужно хранить объекты разных типов, например, в коллекциях (срезах или мапах).
✅ Для обработки данных, тип которых заранее неизвестен, например, при работе с JSON или при передаче произвольных данных в функции.
✅ Когда функция должна принимать различные типы данных.
Когда не использовать:
❗ Использование скрывает типы и может привести к ошибкам на этапе выполнения. Лучше использовать конкретные типы, когда это возможно.
❗ Преобразование типов из может быть затратным, что важно учитывать в производительных системах.
👍7
❓ Что такое nil ошибка в Go и как её правильно обрабатывать?
Если ошибка равна nil, это означает, что операция была успешной, и можно продолжать использовать возвращённые данные. Правильная обработка nil ошибки заключается в явной проверке каждого возвращаемого значения ошибки и принятии мер в зависимости от того, является ли ошибка nil или нет.
Если ошибка равна nil, это означает, что операция была успешной, и можно продолжать использовать возвращённые данные. Правильная обработка nil ошибки заключается в явной проверке каждого возвращаемого значения ошибки и принятии мер в зависимости от того, является ли ошибка nil или нет.
🥱18👍7😁2👾1
❓ В чем отличие между каналами, которые буферизуются, и небуферизованными каналами в Go?
Небуферизованный канал не хранит данные. Это значит, что операция записи в канал блокирует отправителя до тех пор, пока другой горутина не примет эти данные из канала.
Буферизованный канал имеет фиксированный размер буфера, в который можно помещать несколько элементов до того, как получатель начнёт забирать данные. Запись в канал не блокирует отправителя, если есть свободное место в буфере. Блокировка произойдёт только, если буфер заполнен.
Небуферизованный канал не хранит данные. Это значит, что операция записи в канал блокирует отправителя до тех пор, пока другой горутина не примет эти данные из канала.
Буферизованный канал имеет фиксированный размер буфера, в который можно помещать несколько элементов до того, как получатель начнёт забирать данные. Запись в канал не блокирует отправителя, если есть свободное место в буфере. Блокировка произойдёт только, если буфер заполнен.
👍12