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

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

Написал программу у которой есть функционал вызова диалога выбора файла через gtk3. Так же у этой программы есть режим только текстовый, без диалога выбора файла. Но так как я использую в этой программе импорт который дает функционал вызова окон, то в зависимостях этот пакет указан и, напрмер, для андроид эта программа уже не собирается(gtk3 нет в репозиоториях термукса), хотя в андроиде можно спокойно использовать исключительно текстовый вариант. А есть ли какой то механизм, позволяющий, например, указать компилятору, что при сборке в ос андроид(чрез термукс) не нужно требовать gtk3. Идеально если можно это сделать добавив что то в .mod файл
Как настроить кастомный GOPATH?


Коллеги, помогите разобраться. Вопрос избитый, но решить по ссылкам в сети пока не получилось (https://go.dev/wiki/SettingGOPATH).

Пытаюсь настроить кастомный gopath, чтобы мои и импортируемые пакеты лежали отдельно от стандартных гошных.

ГО установлен здесь:

D:\Programm Files\Go

Мой ворскспейс здесь:

D:\Kirill_disk_D\GoWorkspace, тут три папки - bin, src, pkg

GOPATH такой:

D:\Kirill_disk_D\GoWorkspace;D:\Programm Files\Go

В каталоге D:\Kirill_disk_D\GoWorkspace\src лежит 2 пакета: customtext и test

D:\Kirill_disk_D\GoWorkspace\src\customtext\customtext.go:

package customtext

const (
NameFrst = "Kirill",
NameScnd = "Sasha"
)
D:\Kirill_disk_D\GoWorkspace\src\test\test.go:

package main

import (
"customtext"
"fmt"
)

func main() {
fmt.Println("Привет", customtext.NameFrst)
}
По запуску test.go:

$ go run "d:\Kirill_disk_D\GoWorkspace\src\test\test.go"

Не видит нужной src из GOPATH и отвечает, что нужного пакета в GOPATH по умолчанию нет:

test.go:4:2: package customtext is not in std (D:\Programm Files\Go\src\customtext)

У меня стоит версия go1.23.0, винда 11.

По команде в cmd:

C:\Users\Kirill>go env -w GOPATH=d:\Kirill_disk_D\GoWorkspace

Отвечает, что на даст переопределить GOPATH:

warning: go env -w GOPATH=... does not override conflicting OS environment variable

Вопрос: как сделать так, чтобы Go видел пакеты из кастомного GOPATH? Что я делаю не так? Заранее спасибо!
😢2👍1
Что делают в коде %v и \n?


У нас есть программа по угадыванию числа. Не понимаю что в ней выполняют символы %v и \n.

func main() {

var number = 43

for {
var n = rand.Intn(100) + 1
if n < number {
fmt.Printf("%v слишком маленькое число.\n", n)
} else if n > number {
fmt.Printf("%v слишком большое число.\n", n)
} else {
fmt.Printf("угадал! %v\n", n)
break

Как понимаю %v проверяет число в переменной(имею ввиду область видимости for), в нашем случае число которое появилось рандомно. Какой синтаксис несет \n инфо к моменту написания вопроса не нашел.
🤡13😱9🤔2
Неблокирующий канал с буфером


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

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

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

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

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

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

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

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


В программе понадобилось открыть проводник и выбрать в нем файл. Как я вижу использование: при работе в терминальной программе я могу ввести опрелеленную комманду и откроется системный проводник в котором можно выбрать файл. После выбора файла в проводнике, в терминальную программу копируется путь к выбранному файлу, а проводник молча закрывается. Далее над файлом по пути осуществляются какие то действия в коде. Как это(открытие прводника и выбор в нем файла) реализовать средствами 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. А как добиться от этого кода ответа на поставленный вопрос?
👍3
Не работает консольная 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.
🔥2🤔1
Oшибка при импорте нескольких пакетов: missing import path go list, missing import path syntax
Не могу импортировать несколько пакетов, пробовал переустанавливать go на последнюю версию, Код:

package main

import {
"fmt"
}

func main() {

}
😁13🤡62
Что произойдёт, если мьютекс заблокирован, но горутина завершится до вызова Unlock?
Anonymous Poll
21%
Мьютекс автоматически разблокируется
15%
Программа завершится с ошибкой
68%
Мьютекс останется заблокированным навсегда
⁉️ Что будет при делении целого отрицательного числа на ноль в Go?
Anonymous Poll
5%
Вернётся бесконечность
84%
Произойдет паника
9%
Вернётся отрицательная бесконечность
6%
Вернётся ноль
🎉6😁1
Может ли select в Go использоваться без кейсов?
Anonymous Poll
77%
Да
24%
Нет
😁3🤔1
Пишите свои предложения в комментариях! 👇

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