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

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
加入频道
Неблокирующий канал с буфером


Помогите сообразить, как сделать следующее, желательно в "го-стиле".

Есть рутина, которая запускает консольную утилиту и парсит её вывод. Данные идут порциями, их частота от меня никак не зависит. Может быть 10+ пакетов в секунду, может 1. Вторая рутина должна брать эти пакеты, немного их обработать и отправить на внешний веб-сервис.

Изначально идея была - делаем канал между этими двуми рутинами. Парсим пакет - записываем в канал - читаем с канала - отправляем. Всё хорошо, пока связь стабильная и быстрая. Как только связь теряется, тормозит - начинается затык. Данные сыпятся быстрее, чем мы можем их отправлять. Важно, что потеря части данных не критична, главное чтобы последние N пакетов держались в памяти и по возможности отправлялись.

Напрашивается что-то типа очереди с автоматическим удалением старых элементов при превышении лимита N. Первая горутина туда кладёт, вторая оттуда достаёт.

То есть другими словами, нужно сделать такой канал с буфером, который бы при записи в него не блокировал (если в канале уже N элементов - самое старое значение удаляется, новое добавляется), а при чтении - блокировал (при отсутствии данных).

Станадртный буферизированный канал не подходит - при заполненном буфере он блокирует запись.

Так как в го я новичок - трудно сообразить как такое наколхозить. Попробовал поискать по репам/гуглу - ничего похожего найти не могу.

Подскажите, куда копать, где можно подсмотреть что-то похожее?
Как выбрать файл через системный проводник?


В программе понадобилось открыть проводник и выбрать в нем файл. Как я вижу использование: при работе в терминальной программе я могу ввести опрелеленную комманду и откроется системный проводник в котором можно выбрать файл. После выбора файла в проводнике, в терминальную программу копируется путь к выбранному файлу, а проводник молча закрывается. Далее над файлом по пути осуществляются какие то действия в коде. Как это(открытие прводника и выбор в нем файла) реализовать средствами go? Пишу код и тестирую в debian, соответственно решение необходимо под unix в первую очередь
Как использовать gemini api в приложении?


Я чайник и пытаюсь потрогать gemini api. Делаю по инструкции.

Зашел в ai studio получил новый
Сохранил этот ключ в константу key

Далее функция

func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, option.WithAPIKey(key))
if err != nil {
log.Fatal(err)
}
defer client.Close()
model := client.GenerativeModel(modelName)
chat := model.StartChat()
test := "hello. Are you working now?"
resp, err := chat.SendMessage(ctx, genai.Text(test))
if err != nil {
log.Fatal(err)
}
log.Println(resp.PromptFeedback)
}
Получаю nil в ответ nil. А как добиться от этого кода ответа на поставленный вопрос?
Не работает консольная GO игра на другой OS windows


Сделал небольшое консольное приложение на go, собрал его под свою ОС (linux mint) оно запускается и работет нормально, Но стоит мне собрать его под виндовс 10 оно не работает

package main

import (
"fmt"
"bufio"
"log"
"math/rand"
"os"
"strconv"
"time"
"strings"
)

func main() {
i := 10

fmt.Println("Game Guess Number! (1 - 15)")
fmt.Println("You have", i, "Attempts", "\n")

for i = i; i > 0; i-- {
seconds := time.Now().UnixNano()
rand.Seed(seconds)

target := float64(rand.Intn(15) + 1)

fmt.Println("Attempt: " ,i)
fmt.Print("Your guess: ", "\n")

reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')

if err != nil {
log.Fatal(err)
}

input = strings.TrimSpace(input)
guess, err := strconv.ParseFloat(input, 64)

if err != nil {
fmt.Println("error type is not a number")
log.Fatal(err)
}

if guess == target {
fmt.Println("You Won!!!", "\n")
break
} else if guess > target {
fmt.Println("Too High", "\n")
} else if guess < target {
fmt.Println("Too Low", "\n")
}
}

if i == 0 {
fmt.Println("You lose :(", "\n")
}

fmt.Println("Game End")
}

wine GuessNumberGame.exe
0074:err:winediag:is_broken_driver Broken NVIDIA RandR detected, falling back to RandR 1.0. Please consider using the Nouveau driver instead.
Game Guess Number! (1 - 100)
You have 10 Attempts

Attempt: 10
Your guess:
2024/08/28 01:58:12 read /dev/stdin: input/output error

    ~/Документы/temps    main !1 ?1   01:58:12  ─╮
❯ 0034:err:winediag:is_broken_driver Broken NVIDIA RandR detected, falling back to RandR 1.0. Please consider using the Nouveau driver instead.
Oшибка при импорте нескольких пакетов: missing import path go list, missing import path syntax
Не могу импортировать несколько пакетов, пробовал переустанавливать go на последнюю версию, Код:

package main

import {
"fmt"
}

func main() {

}
Может ли select в Go использоваться без кейсов?
Anonymous Poll
77%
Да
24%
Нет
Пишите свои предложения в комментариях! 👇

А тем, кто хочет узнать ответ скорее, — барабанная дробь... 3
Можно ли использовать тип interface{} в качестве ключа в мапе?
Anonymous Poll
28%
Да, в любом случае
20%
Да, если интерфейс не пустой
53%
Нет
Где будут находиться переменные из каждой функции — в стеке или в куче?

👇 Пишите свои ответы в комментариях!

А вот ответ: переменная p в первой функции будет находиться в куче, а во второй — в стеке.
💡 Создайте простой кэш в памяти с использованием языка Go

Делитесь своими решениями в комментариях! 👇
Там же можно найти ответ!