Golang задачи с собеседований
4.63K subscribers
475 photos
6 videos
12 files
243 links
Задачи, тесты и теоретические вопросы по Go. Так же по gin, grpc, горутинах, архитектуре api и http стэку.

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
Download Telegram
Обработка сообщений, которые содержат альбомы (media_group), через telegram api


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

В ситуации, когда одно сообщение содержит только текст и/или одно изображение, всё хорошо. Получаем один update, в нём лежат все данные, извлекаем и обрабатываем.

Сложности возникают с обработкой сообщений, которые содержат так называемый альбом (медиа группу). Как пример - сообщение, в котором вложены две и более фотографии.

В этом случае бот получает такие сообщения как бы фрагментами (отдельными update'ами). Например, сообщение, состоящее из двух фотографии, бот получит по API в трёх разных update’ах.

Сложность с тем, чтобы понять:

Когда «долетит» последний "фрагмент", после которого можно приступить к анализу всего сообщения?
Как потом обратиться ко всем фрагментам этого сообщения?
Просматривая такие сообщения с помощью бота Json Dump, я увидел, что у такой «пачки» одинаковое значения поля «media_group_id». Вероятно, это и есть связующий ключ. Но два вышеуказанных вопроса по прежнему актуальны.

Не хотелось бы делать костыли в виде глобальной/статической переменной, в которой я должен запоминать начало получения такого сообщения. К тому же, у меня нет понимания: гарантирует ли API телеграмма, что между "фрагментами" одного сообщения не залетит update от другого события/сообщения.🤷‍♂️

В общем, буду признателен за любые мысли. Желательно, на языке golang. Но можно и на другом. Мне важно понять подход, как подступиться к этой задаче.
Что произойдёт при чтении из закрытого chan struct{}?
Anonymous Poll
19%
nil false
38%
{} false
40%
panic: reading from a closed channel
4%
runtime error
Golang. Вывод суммы в рублях и копейках


Всем привет, только начал изучать go не ругайте сильно. Решил задачку, но думаю что есть более элегантное решение с выводом, подскажите пожалуйста как бы Вы решили ее.

Текст задачи:

Напишите программу, которая считывает строку и выводит ее предполагаемую цену, 1 символ = 23 копейки в следующем формате:

Y коп. - если цена не дотягивает до рубля.

X р. Y коп. - если цена превышает 1 рубль.

package main

import (
"fmt"
"unicode/utf8"
)

func main() {
var praic float64 = 0.23
var samplText string
var result int
fmt.Scan(&samplText)
result = utf8.RuneCountInString(samplText)
var resultRub float64 = float64(result) * praic
var RUB int = int(resultRub)
if resultRub > 1.00 {
fmt.Printf("%d р. %d коп.", int64(RUB), int((resultRub-float64(RUB))*100))
} else {
fmt.Printf("%d коп.", int(resultRub*100))
}
}
Пишите свои мысли в комментариях 👇

Ответ: Информацию можно отправить.
Какой принцип REST API нарушается, если сервер хранит состояние сеанса пользователя?
Anonymous Poll
2%
Uniform Interface
78%
Stateless
6%
Cacheable
2%
Layered System
15%
Узнать ответ
Как передать неограниченное количество аргументов разных типов
Anonymous Poll
7%
func myFunc(args ...int)
13%
func myFunc(args []interface{})
80%
func myFunc(args ...interface{})
6%
Узнать ответ
Пишите свои ответы в комментариях 👇

На самом деле ответ — 0, так как nil-мапа позволяет использовать метод get. А метод set не позволит скомпилировать код.
Свой VPN на golang


Решил сделать свой VPN на golang. В принципе основную часть сделал:

Программа создаёт виртуальный интерфейс TUN
Подключается к VPN серверу по UDP
И передает данные из TUN на сервер, а с сервера в TUN
На сервере примерно тот же самый сценарий. Как я понял, это уже является VPN (только без шифрования, но это я добавлю). Хотелось бы дать клиенту доступ в интернет, то есть что бы на сервере IP пакеты отправлялись дальше в сеть и с сети клиенту. Это я и не понимаю, как сделать. Всё делаю под Windows.
Можно ли использовать fallthrough в default-блоке switch
Anonymous Poll
36%
Да
52%
Нет
14%
Узнать ответ
Какой метод используется для выполнения SQL-запросов без возврата данных
Anonymous Poll
13%
Query()
77%
Exec()
7%
RunSQL()
5%
QueryRow()
Можно ли создать цикл for без условий в Go?
Anonymous Poll
94%
Да
4%
Нет
2%
Узнать ответ
Будет ли defer активироваться после каждой итерации?

Делитесь своими мыслями в комментариях 👇 Там же мы предоставим ответ.