cookie

Sizning foydalanuvchi tajribangizni yaxshilash uchun cookie-lardan foydalanamiz. Barchasini qabul qiling», bosing, cookie-lardan foydalanilishiga rozilik bildirishingiz talab qilinadi.

avatar

Библиотека Go для собеса | вопросы с собеседований

Вопросы с собеседований по Go и ответы на них. Список наших каналов: https://t.me/proglibrary/8353 Учиться у нас: https://proglib.io/w/907158ab Обратная связь: @proglibrary_feedback_bot По рекламе: @proglib_adv Прайс: @proglib_advertising

Ko'proq ko'rsatish
Reklama postlari
4 157
Obunachilar
+3124 soatlar
+737 kunlar
+25630 kunlar

Ma'lumot yuklanmoqda...

Obunachilar o'sish tezligi

Ma'lumot yuklanmoqda...

💬 В чем преимущество использования iota в Go? iota — это предопределенное значение, которое можно использовать в объявлении const для создания последовательности связанных значений. Использование приема с iota избавляет от необходимости вручную присваивать значения константам. Вместо этого можно записать такое определение:
type EventType byte
const (
    _ = iota // iota == 0; игнорировать нулевое значение EventDelete
    EventType = iota // iota == 1
    EventPut // iota == 2; неявное присваивание
)
В объявлении константы iota представляет последовательно увеличивающиеся нетипизированные целочисленные значения, которые можно использовать для создания набора связанных констант. В начале каждого объявления const идентификатор iota получает нулевое значение и затем увеличивается с каждой операцией присваивания значения новой константе (независимо от использования ссылки на идентификатор iota). Поскольку iota является нетипизированным числом, его можно использовать для присваивания типизированных значений без явного приведения типов, даже кон- станте с типом float64:
const (
    u = iota * 42 // iota == 0; u == 0 (нетипизированная целочисленная константа)
    v float64 = iota * 42 // iota == 1; v == 42.0 (константа типа float64)
)
Ключевое слово iota допускает неявное перечисление, что делает тривиальным создание произвольно длинных наборов связанных констант, как это показано в следующем примере, где перечисляются различные единицы измерения размеров в байтах:
type ByteSize uint64

const (
    _ = iota
    KB ByteSize = 1 << (10 * iota) MB
    GB
    TB
    PB
)
Hammasini ko'rsatish...
👍 10
💬 Что такое идемпотентность? Идея идемпотентности (тождественности влияния) зародилась в алгебре, где описывает определенные свойства некоторых математических операций. В мире программирования операция считается идемпотентной, если ее однократное выполнение имеет тот же эффект, что и многократное. Например, операция присваивания x = 1 идемпотентна, потому что после ее выполнения x всегда будет хранить 1, независимо от того, сколько раз ее выполнить. Точно так же HTTP-метод PUT является идемпотентным, поскольку многократная отправка ресурса в какое-либо место ничего не изменит: повторная отправка не даст ничего нового. Операция x += 1, однако, не является идемпотентной, потому что после каждого ее выполнения создается новое состояние.
Hammasini ko'rsatish...
👍 7 5
💬 Чем отличаются сигналы Linux? Какие можно перехватить? Сигналы в Linux представляют собой ограниченную форму межпроцессного взаимодействия, используемую для отправки уведомлений процессу о различных событиях. Они часто используются для уведомления процесса о необходимости завершения работы или информирования о возникновении какой-либо ошибки. 📌 Основные различия: 1. Синхронные сигналы — вызываются ошибками в программе (например, деление на ноль). Эти сигналы отправляются напрямую процессу, выполняющему ошибочное действие. 2. Асинхронные сигналы — посылаются внешними процессами или системой. Например, SIGKILL или SIGTERM, отправляемые для завершения процесса. 📌 Перехватываемые и неперехватываемые сигналы: 🔹 Перехватываемые сигналы могут быть обработаны программой. Программа может определить функцию-обработчик для таких сигналов, изменяя стандартное поведение. Например, SIGTERM и SIGUSR1 можно перехватить и обработать, выполнив определённые действия перед завершением программы или инициированием других процедур. 🔹 Неперехватываемые сигналы нельзя перехватить или проигнорировать. Эти сигналы немедленно выполняют своё стандартное действие. Примером неперехватываемого сигнала является SIGKILL, который всегда немедленно завершает процесс. 📌 Примеры перехватываемых сигналов: 🔹 SIGTERM — просит процесс завершиться. Это корректный способ попросить программу завершить свою работу. 🔹 SIGHUP — уведомляет процесс о потере управляющего терминала. Часто используется для перезагрузки конфигураций сервисов. 🔹 SIGUSR1, SIGUSR2 — резервируются для использования в пользовательских приложениях. 📌 Примеры неперехватываемых сигналов: 🔹 SIGKILL — немедленно завершает процесс. Не может быть перехвачен или обработан. 🔹 SIGSTOP — останавливает (приостанавливает) процесс до получения сигнала SIGCONT.
Hammasini ko'rsatish...
👍 15
💬 Что из себя представляет механизм method value и чем он полезен? Method value — механизм, который позволяет ссылаться на метод объекта с привязкой к конкретному экземпляру этого объекта. Это значит, что мы можем сохранить ссылку на метод определённого экземпляра и использовать эту ссылку для вызова метода позже, при этом метод автоматически будет вызываться для связанного с ним экземпляра. 📌 Как это работает: когда мы берём метод от экземпляра структуры или типа, Go автоматически создаёт функцию, которая "замыкает" этот экземпляр внутри себя. Эта функция при вызове будет применять метод к тому экземпляру, для которого она была создана. 📌 Пример:

type Counter struct {
    value int
}

func (c *Counter) Increment() {
    c.value++
}

func main() {
    c := &Counter{value: 10}
    increment := c.Increment // Сохраняем method value
    increment() // Вызываем метод через сохранённую ссылку
    fmt.Println(c.value) // Выведет 11
}
В примере increment является method value, которое привязано к конкретному экземпляру c. Вызов increment() эквивалентен вызову c.Increment(). Method value особенно полезны в ситуациях, когда необходимо передать метод как аргумент функции или сохранить метод для последующего вызова. Это позволяет использовать методы объектов так, как если бы они были обычными функциями, при этом сохраняя контекст вызова внутри метода.
Hammasini ko'rsatish...
👍 22🥱 2🤔 1
💬 Допустимо ли возвращать ответ "HTTP 200 OK", когда на стороне сервера произошла ошибка (сведения об ошибке будут содержаться внутри тела ответа)? Допустимо для ошибок бизнес-логики приложения, однако в большинстве случаев это зависит от конкретного юзкейса. Статус "200 OK" зачастую используется только тогда, когда запрос был успешно обработан и результаты этой обработки соответствуют ожиданиям клиента. В случае возникновения ошибки следует использовать соответствующие статусы ответа HTTP, которые точно отражают природу проблемы. Например: 🔹 500 Internal Server Error — для неустранимых ошибок на стороне сервера. 🔹 503 Service Unavailable — если сервер временно недоступен, например, из-за перегрузки или технического обслуживания. 🔹 400 Bad Request — если ошибка возникла из-за некорректных данных, предоставленных клиентом. 🔹 404 Not Found — если запрос был направлен на несуществующий ресурс. 🔗 Все коды состояния ответа HTTP 🔗 Обсуждение на StackOverflow
Hammasini ko'rsatish...
List of HTTP status codes

response codes of the Hypertext Transfer Protocol

4
Если ты — golang-разработчик и страдаешь от недостатка профильных конференций, у нас для тебя клевая новость. Уже 13 мая стартует новый сезон Podlodka Go Crew с темой «базы данных». Мы в Podlodka организовываем онлайн-конференции по разным секциям разработки, так что тебе не придётся куда-то ехать. Все знания получишь прямо у экрана своего монитора. ⭐️ Научимся сравнивать библиотеки и ORM вместе с Арсеном Абдусаламовым из Авито. Познакомимся с решениями как можно подключаться к базам данных и узнаем про «Go way» способ. ⭐️ Попрактикуемся обращаться с распределённым MySQL с помощью Vitess вместе с Ильёй Ушаковым. Ведь одного инстанса MySQL в какой-то момент может начать не хватать. Что же делать, если переходить на NoSQL совсем неохота? Vitess — ответ на этот вопрос, золотая середина между NoSQL distributed базами данных и проверенным опытом MySQL. ⭐️ Узнаем всё о продвинутых структурах данных в Redis вместе с Олегом Арутюновым из Контура. Углубимся в преимущества и недостатки подхода, разберёмся с миграциями данных и оптимизацией базы. ⭐️ Мокать или предзаполнять базы данных? На этот вопрос ответят спикеры из Ozon Fintech. И это будет не просто доклад, а баттл: не на жизнь, а на смерть. Разберёмся, когда какой подход выбрать и стоит ли ограничиваться только одним. 🎁Бонус: публичный собес по работе с PostgreSQL. И это, естественно, не все сессии сезона. Залетай за билетом, чтобы не пропустить специализированную конференцию для Golang-разработчиков Реклама. ИП Толстая Елена Петровна
Hammasini ko'rsatish...
💬 Как использовать io.TeeReader в Go для логирования содержимого HTTP-запроса перед его обработкой? Каковы потенциальные преимущества и ограничения такого подхода? io.TeeReader в Go используется для одновременного чтения данных из io.Reader и копирования этих данных в io.Writer. Это особенно полезно при логировании содержимого HTTP-запросов в мидлваре, позволяя одновременно читать и логировать данные, не теряя их для последующей обработки. Преимущества использования io.TeeReader включают возможность прозрачного логирования данных запроса без изменения основного потока чтения данных. Ограничение заключается в том, что использование io.TeeReader может привести к незначительному увеличению задержек из-за дополнительной операции записи во время чтения данных. 📌 Простой пример:
package main

import (
    "fmt"
    "io"
    "io/ioutil"
    "log"
    "net/http"
    "strings"
)

func logRequestData(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // Создание буфера для логирования данных запроса
        var buf strings.Builder
        teeReader := io.TeeReader(r.Body, &buf)

        // Чтение и логирование содержимого запроса
        body, err := ioutil.ReadAll(teeReader)
        if err != nil {
            http.Error(w, "Ошибка при чтении тела запроса", http.StatusInternalServerError)
            return
        }
        
        // Запись данных обратно в тело запроса для последующей обработки
        r.Body = ioutil.NopCloser(strings.NewReader(buf.String()))

        // Вывод тела запроса в лог
        log.Printf("Received request with body: %s", body)

        // Продолжение обработки запроса
        next.ServeHTTP(w, r)
    })
}

func mainHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Запрос обработан")
}

func main() {
    finalHandler := http.HandlerFunc(mainHandler)
    http.Handle("/", logRequestData(finalHandler))
    log.Println("Сервер запущен на порту 8080")
    http.ListenAndServe(":8080", nil)
}
В примере мы создаем мидлваре, которая использует io.TeeReader для чтения тела HTTP-запроса, одновременно логируя его в stdout. Это позволяет сохранить неизменным первоначальный поток данных запроса для дальнейшей обработки в последующих обработчиках.
Hammasini ko'rsatish...
🔥 3👍 2
💬 Как в Go отформатировать строку без её вывода? С использованием функции fmt.Sprintf. Она работает аналогично fmt.Printf, но вместо вывода результата в стандартный вывод, она возвращает отформатированную строку. Мы можем использовать fmt.Sprintf для создания строк с переменными или сложными форматами, которые затем могут быть использованы в коде или сохранены для последующего использования.
Hammasini ko'rsatish...
🥱 15👍 5
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом. Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций. Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах. 👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Hammasini ko'rsatish...
💬 Для каких целей могут использоваться функции с префиксом 'Must'? Функции с префиксом "Must" ("must") предупреждают, что они могут вызвать панику, если что-то пойдет не так. Они часто используются для: 🔹 Инициализации задач, которые не должны завершаться неудачей, например, настройка глобальных переменных в начале приложения, настройка регулярных выражений, подключение к базам данных и т. д. 🔹 В кейсах тестирования они позволяют немедленно завершить тест с помощью t.Fatal, если что-то идет не так. Функции Must упрощают обработку ошибок в конкретных контекстах, но их следует использовать осторожно, чтобы избежать нежелательной паники.
Hammasini ko'rsatish...
👍 10🤔 2 1