en
Feedback
Golang | Вопросы собесов

Golang | Вопросы собесов

Open in Telegram
4 803
Subscribers
-224 hours
-187 days
-3830 days
Posts Archive
🤔 Какие есть способы написания обобщенного кода ? 1. Интерфейсы: - Подходят для обобщения кода, работающего с разными типами, реализующими определенные методы. 2. Дженерики (Go 1.18+): - Позволяют создавать функции и структуры с параметризованными типами. 3. Композиция функций: - Использование функций высшего порядка для обработки различных данных. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Получи грант до 1,35 млн руб. на обучение в магистратуре Хочешь развиваться в сфере ИТ и получить фундаментальные знания с пр
Получи грант до 1,35 млн руб. на обучение в магистратуре Хочешь развиваться в сфере ИТ и получить фундаментальные знания с практикой? Поступай в магистратуру Центрального университета! — 4 офлайн программы по востребованным направлениям ИТ — 2 онлайн-программы: машинное обучение и продуктовый менеджмент — 550 грантов до 75% — Вечерние занятия и учеба по выходным — удобно совмещать с работой — Обучение по модели STEM-образования: на стыке науки, технологий и бизнеса — Возможность стажировок и трудоустройства в ведущих компаниях — Государственный диплом за 2 года Магистратура в Центральном университете — это современный подход к образованию, сильный преподавательский состав и актуальные кейсы от индустрии. Оставляй заявку на грант уже сейчас! Зарегистрироваться #реклама 16+ cu.ru О рекламодателе

🤔 Как сделать свои методы для пакета? В Go методы создаются для структур (или типов) внутри пакета. Это позволяет добавлять логику и поведение объектам. 🚩Создание собственного пакета Допустим, мы создаем пакет mathutils, который будет содержать метод для структуры Calculator.
package mathutils

// Calculator - структура с данными
type Calculator struct {
    A, B int
}

// Sum - метод для сложения чисел A и B
func (c Calculator) Sum() int {
    return c.A + c.B
}
🚩Использование пакета в другом файле Теперь мы можем использовать этот метод в основном файле программы.
package main

import (
    "fmt"
    "mypackage/mathutils" // Импортируем наш пакет
)

func main() {
    calc := mathutils.Calculator{A: 5, B: 3}
    fmt.Println("Sum:", calc.Sum()) // Выведет: Sum: 8
}
🚩Указатели vs. Значения в методах Методы можно объявлять как для значений (func (c Calculator)) так и для указателей (func (c *Calculator)). Когда использовать указатели? Если метод изменяет данные структуры. Чтобы избежать копирования больших структур.
func (c *Calculator) Multiply(factor int) {
    c.A *= factor
    c.B *= factor
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Где переменная находится при её выделении в горутине? В Go переменные, объявленные внутри горутины, по умолчанию аллоцируются на стеке этой горутины. Однако компилятор Go использует escape-анализ, чтобы определить: - Если переменная используется только внутри функции, она остаётся на стеке. - Если ссылка на переменную передаётся за пределы функции (например, через замыкание), переменная переносится в кучу (heap). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

В дороге или между встречами, а задачу поставить нужно? Просто запишите голосовое в чате. ИИ в Битрикс24 сделает всё за вас: расшифрует сообщение, проанализирует эмоции, создаст задачу, назначит исполнителя, определит срок и даже предложит чек-лист. Работает в любых чатах и в мобильном приложении. ⚡ Попробовать можно в демо, 15 дней бесплатно Узнать больше #реклама 16+ bitrix24.ru О рекламодателе

Привет, ребята! У нас для вас отличные новости — на easyoffer вышло сразу несколько крупных обновлений: 1. Автоотклики на HeadHunter Снова работают в полную силу — можно смело возвращаться к активному поиску. 2. Новый раздел «Резюмейкер» Теперь вы можете быстро создавать уникальные резюме, адаптированные под каждую вакансию, и сразу добавлять сопроводительное письмо. Это заметно повышает шансы получить приглашение на собеседование. 3. База вопросов стала чище Мы навели порядок и удалили около 30% дубликатов. Ориентироваться стало проще. –––––––––––––––––– 🔥 Акция в честь обновления Пожизненный тариф easyoffer PRO — по цене одного года. Успейте до 23 июня: 👉 https://easyoffer.ru/pro –––––––––––––––––– Что дальше? В ближайшие пару недель добавим ещё два раздела: 1. Сообщество с чатами по всем профессиональным направлениям. 2. Агрегатор вакансий, чтобы поиск работы стал ещё удобнее.

🤔 Как передаются параметры в функцию — по указателю или по значению? По умолчанию в Go все параметры передаются по значению, т.е. копируются. Но если передать указатель на переменную, можно изменить её содержимое. Это единственный способ передать значение по ссылке. Тип *T указывает, что это указатель, а не значение. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Получи грант до 3,48 млн на обучение дизайну Поступай на дизайн в Центральный университет с грантом. Для учеников 10–11-х кла
Получи грант до 3,48 млн на обучение дизайну Поступай на дизайн в Центральный университет с грантом. Для учеников 10–11-х классов и СПО. Освой графический, UI/UX и продуктовый дизайн. Создавай визуальные концепты будущего. На программе студенты получают фундаментальную базу, развивают прикладные навыки, приобретают опыт работы над реальными проектами, собирают портфолио и строят связи внутри дизайн-сообщества Подать заявку #реклама 16+ cu.ru О рекламодателе

🤔 Почему нельзя брать ссылку на значение, хранящееся по ключу в map? Элементы map не гарантируют стабильное расположение в памяти, так как map может перераспределять внутренние данные. Это делает адрес элемента недействительным. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Конкурс веб-дизайнеров Конкурс для веб-дизайнеров по разработке цифрового меню для кофейни или точки продаж кофе на вынос. Приз 30.000 руб. Узнать больше #реклама О рекламодателе

🤔 Как прочитать строку в виде иероглифов, кириллицы и т.д.? В Go строки хранятся в UTF-8, что позволяет корректно работать с символами любых языков (включая иероглифы, кириллицу и т.д.). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Получи грант до 3,48 млн на обучение дизайну Поступай на дизайн в Центральный университет с грантом. Для учеников 10–11-х кла
Получи грант до 3,48 млн на обучение дизайну Поступай на дизайн в Центральный университет с грантом. Для учеников 10–11-х классов и СПО. Освой графический, UI/UX и продуктовый дизайн. Создавай визуальные концепты будущего. На программе студенты получают фундаментальную базу, развивают прикладные навыки, приобретают опыт работы над реальными проектами, собирают портфолио и строят связи внутри дизайн-сообщества Подать заявку #реклама 16+ cu.ru О рекламодателе

🤔 Можно ли изменить определенный символ в строке? Нет, строки (string) в Go неизменяемы (immutable). Это значит, что нельзя просто изменить один символ в строке. 🚩Почему нельзя изменить символ? Строка в Go — это байтовый срез ([]byte), но неизменяемый. Когда вы создаёте строку
s := "hello"
Ошибка при попытке изменения символа напрямую
s := "hello"
s[0] = 'H' // Ошибка: cannot assign to s[0]
🚩Как изменить символ в строке? Поскольку строка неизменяема, вам нужно создать новую строку с заменённым символом. Способ 1: Преобразовать в []byte (для ASCII-строк) Если строка содержит только английские буквы и символы ASCII, её можно преобразовать в []byte, заменить символ и создать новую строку.
package main

import "fmt"

func main() {
    s := "hello"
    b := []byte(s) // Преобразуем в изменяемый []byte
    b[0] = 'H'     // Меняем первый символ
    s = string(b)  // Преобразуем обратно в строку

    fmt.Println(s) // "Hello"
}
Способ 2: Преобразовать в []rune (для Unicode) Если строка содержит русские буквы, эмодзи или другие многобайтовые символы, используйте []rune.
package main

import "fmt"

func main() {
    s := "привет"
    r := []rune(s) // Преобразуем в []rune (массив символов)
    r[0] = 'П'     // Меняем первый символ
    s = string(r)  // Преобразуем обратно в строку

    fmt.Println(s) // "Привет"
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 В чем разница TCP и UDP? TCP (Transmission Control Protocol) — это протокол, который обеспечивает надёжную передачу данных, гарантируя, что все пакеты будут доставлены в правильном порядке и без потерь. TCP устанавливает соединение между клиентом и сервером перед передачей данных, проверяет целостность пакетов и управляет повторной передачей потерянных данных. UDP (User Datagram Protocol) не гарантирует доставку пакетов, не обеспечивает контроль за порядком их получения и не требует установления соединения, что делает его более быстрым, но менее надёжным. UDP предпочтителен для приложений, где скорость важнее надёжности, например, для видеостриминга или онлайн-игр. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Больше выгоды с подпиской Kaspersky Premium Купите подписку Kaspersky Premium сейчас и получите скидку до 28%, гарантированны
Больше выгоды с подпиской Kaspersky Premium Купите подписку Kaspersky Premium сейчас и получите скидку до 28%, гарантированные призы от наших партнёров, а также шанс выиграть путешествие! Узнать больше #реклама 16+ kaspersky.ru О рекламодателе

🤔 Какие известны алгоритмы балансировки нагрузки? Наиболее популярные: - Round Robin — по очереди между серверами. - Least Connections — наименьшее число активных соединений. - IP Hashing — клиент всегда попадает на один и тот же сервер. - Random — случайный выбор. - Consistent Hashing — устойчив к изменениям числа серверов, часто используется в распределённых кешах. - Load-based (метрический) — выбор по метрикам (CPU, RAM, отклик), требует мониторинга. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Запустите рекламу в телеграм-каналах через Яндекс Директ Перфоманс-реклама в мессенджере продолжает работать: • Таргетинг по
Запустите рекламу в телеграм-каналах через Яндекс Директ Перфоманс-реклама в мессенджере продолжает работать: • Таргетинг по тематикам и регионам • Умный подбор каналов • Гибкие модели оплаты (CPC и CPV) Яндекс Директ знает, как привлечь целевую аудиторию 💰👌 Попробовать #реклама yandex.ru О рекламодателе

🤔 Зачем нужны WaitGroup? В Go sync.WaitGroup используется для синхронизации выполнения горутин. Она позволяет основной горутине (или любой другой горутине) ждать завершения группы горутин перед продолжением работы. Это особенно полезно, когда нужно убедиться, что все фоновые задачи завершены до выполнения дальнейших действий. 🚩Основные функции WaitGroup 🟠Add(delta int) Увеличивает (или уменьшает) счетчик горутин на заданное значение delta. Обычно вызывается до запуска горутин, чтобы установить количество горутин, которые нужно дождаться. 🟠Done() Уменьшает счетчик горутин на 1. Вызывается горутиной, когда она завершает свою работу. 🟠Wait() Блокирует выполнение до тех пор, пока счетчик горутин не станет равен нулю. Обычно вызывается основной горутиной для ожидания завершения всех горутин. 🚩Пример использования `WaitGroup` Мы используем WaitGroup для ожидания завершения нескольких горутин.
package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done() // Уменьшает счетчик на 1 при завершении работы горутины
    fmt.Printf("Worker %d starting\n", id)
    time.Sleep(time.Second)
    fmt.Printf("Worker %d done\n", id)
}

func main() {
    var wg sync.WaitGroup

    for i := 1; i <= 5; i++ {
        wg.Add(1) // Увеличивает счетчик горутин на 1
        go worker(i, &wg)
    }

    wg.Wait() // Ожидает завершения всех горутин
    fmt.Println("All workers done")
}
🟠Мы создаем 5 горутин, каждая из которых выполняет функцию worker. 🟠Счетчик WaitGroup увеличивается на 1 перед запуском каждой горутины с помощью wg.Add(1). 🟠Каждая горутина вызывает wg.Done() при завершении, уменьшая счетчик на 1. 🟠Основная горутина вызывает wg.Wait(), блокируясь до тех пор, пока все горутины не завершат свою работу. 🚩Почему `WaitGroup` необходимы 🟠Синхронизация выполнения Позволяет основной горутине дождаться завершения всех запущенных горутин, что особенно важно для корректного завершения программы или выполнения зависимых задач. 🟠Избежание дедлоков Гарантирует, что основная горутина не завершит выполнение программы до того, как завершатся все горутины, предотвращая возможные дедлоки или незавершенные операции. 🟠Упрощение управления горутинами Позволяет легко управлять множеством горутин, не требуя сложной логики для отслеживания их завершения. 🚩Пример с ошибкой без `WaitGroup` Без использования WaitGroup основной поток может завершиться до завершения всех горутин, что приведет к неполной обработке данных. В этом примере использование time.Sleep для ожидания является ненадежным и не гарантирует завершение всех горутин. Вместо этого правильное использование WaitGroup обеспечивает корректное завершение всех задач.
package main

import (
    "fmt"
    "time"
)

func worker(id int) {
    fmt.Printf("Worker %d starting\n", id)
    time.Sleep(time.Second)
    fmt.Printf("Worker %d done\n", id)
}

func main() {
    for i := 1; i <= 5; i++ {
        go worker(i)
    }

    time.Sleep(2 * time.Second) // Это не гарантирует завершение всех горутин
    fmt.Println("All workers done")
}
Ставь 👍 и забирай 📚 Базу знаний

Аренда VPS/VDS-сервера. Виртуальные выделенные серверы в дата-центрах уровня Tier III — 7 готовых конфигураций от 200 ₽/мес.
Аренда VPS/VDS-сервера. Виртуальные выделенные серверы в дата-центрах уровня Tier III — 7 готовых конфигураций от 200 ₽/мес. Преимущества аренды: - Выделенные ресурсы без переплаты; - KVM-виртуализация; - Быстрые NVMe SSD; - Соответствие 152-ФЗ, PCI DSS; - Бесплатная защита от DDoS; - Управление через панель, API и Terraform; - Техподдержка 24/7. Запустите сервер за несколько минут! Попробовать #реклама 16+ selectel.ru О рекламодателе

🤔 Чем горутины отличаются от тредов Горутины — это легковесные потоки выполнения в Go, которые управляются рантаймом Go и потребляют меньше ресурсов, чем обычные потоки (треды). В отличие от потоков, горутины могут выполняться совместно на одном или нескольких потоках, что позволяет Go эффективно использовать многопоточность. Горутины легко создавать и завершать, их переключение выполняется быстрее, что делает их подходящими для масштабируемых параллельных задач. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний