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

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
加入频道
Бот не отвечает на команды в канале Telegram


Хочу сделать так, чтобы бот мог отсылать сообщения в канал. С группами он взаимодействует, а вот с каналами нет. На канале у него есть все права.

package tg

import (
"log"
"os"

tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
)

var UserId []int64

func Telegram() (*tgbotapi.BotAPI, error) {
bot, err := tgbotapi.NewBotAPI(os.Getenv("API_KEY"))
if err != nil {
return nil, err
}
u := tgbotapi.NewUpdate(-1)

updates := bot.GetUpdatesChan(u)

go func() {
for update := range updates {
if update.Message == nil {
continue
}

if !update.Message.IsCommand() {
continue
}

msg := tgbotapi.NewMessage(update.Message.Chat.ID, "")

switch update.Message.Command() {
case "start":
UserId = append(UserId, update.Message.Chat.ID)
msg.Text = "Парсер запущен."

default:
msg.Text = "Неизвестная команда."
}

if _, err := bot.Send(msg); err != nil {
log.Println(err)
}
}
}()
return bot, nil
}
Как поменять go.mod, чтобы go build не просил выполнить go mod tidy

Мне нужно сменить версию go в go.mod с 1.22.3 на 1.22 Или написать так:

module main

go 1.22

toolchain go1.22.3

req...
После чего запустить go build, но при ручном изменении go build выдаёт: go: updates to go.mod needed; to update it: go mod tidy

ВАЖНО: я не могу использовать 1.22.3, мне нужен именно 1.22 для статического анализатора, иначе он не будет работать.

Я пробовал менять руками или ставить различные флаги при сборке. Игнорирования этого требования просто нет. Изменить файл просто так я тоже не могу, требование go mod tidy все равно появляется.
Как распечатать переменные структуры в консоли?

Как напечатать в консоли все поля этой структуры в Golang?

type Project struct {
Hash string json:"hash"
Name string json:"name"
Data Data json:"data"
Joins Joins json:"joins"
}
Не могу получить параметры запроса

Есть такой шаблон

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="/auth", method="post">
<input type="text" name="issuer" placeholder="login">
<input type="password", name="password" placeholder="password">
<input type="text" name="service" value={{.Service}} hidden >
<input type="submit" value="login">
</form>
</body>
</html>
Он лежит на сервере по пути /auth и вызывается исключительно методом GET

router.HandleFunc("/auth", controllers.MWDisplayHTML).Methods(http.MethodGet)
Ожидаемое поведение:

Ввожу логин и пароль, нажимаю "login" и происходит запрос post на сервер.

func MWDisplayHTML(w http.ResponseWriter, r *http.Request) {
_, cancel := context.WithTimeout(context.Background(), time.Second*4)
defer cancel()
templ, err := template.ParseFiles(consts.LoginHTMLPath)
if err != nil {
log.Println(err)
return
}
description, err := getDecriptionFromReq(r)
if err != nil {
return
}
serviceTempl := CustomTemplate{Service: description}
err = templ.Execute(w, serviceTempl)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte(err.Error()))
return
}
}
На обработчике post запросов с указанного шаблона висит обработчик, который пытается получить значение полей issuer и password. Вот функция которую я вызываю в этом обработчике для получения поля issuer

func getIssuerNameFromRequest(r *http.Request) (string, error) {
uname := r.URL.Query().Get(consts.IssuerKey)
if len(uname) < consts.MinIndx {
return consts.Empty, fmt.Errorf("%s", errs.ErrNameFieldIsEmpty)
}
return uname, nil
}
Но почему то, когда я ввожу логин и пароль то r.url.query.get не находит указанного поля. Раньше все работало, не могу понять что изменилось
Как принять сообщение от пользователя и сохранить в переменную Telegram bot?

Делаю бота на библиотеки TeleGO, и ни как не пойму как мне принять сообщение от пользователя, записать и передать в другую функцию.

В моем понимании должно быть так, с callback вызываем цепочку

Запрос цифры от пользователя
пользователь вводит и получаем переменную tag
выводим консоль значение переменой tag
Вот код который я использую.

bh.Use(func(bot *telego.Bot, update telego.Update, next th.Handler) {
bot.SendMessage(tu.Message(tu.ID(update.CallbackQuery.From.ID), "Сажи число!"))
next(bot, update)
})

task := bh.Group(th.CallbackDataEqual("addTag"))

task.Use(func(bot *telego.Bot, update telego.Update, next th.Handler) {
num := update.Message.Text
fmt.Println(num)
if len(update.Message.Text) > 0 {
next(bot, update)
}
})

// Handle updates on a group
task.HandleMessage(func(bot *telego.Bot, message telego.Message, ) {
fmt.Println(message)
})
По ошибке, я вижу, чт омы сразу получаем сообщение от бота, пользователь ввести ничего не успевает и программа падает, тк пришел указатель на nil.

[Mon May 27 14:34:18 MSK 2024] DEBUG API response sendMessage: Ok: true, Err: [<nil>], Result: {"message_id":1169,"from":{"id":6964563095,"is_bot":true,"first_name":"livsi_games_news","username":"livsi_games_news_bot"},"chat":{"id":375152786,"first_name":"\u041b\u0435\u043e\u043d\u0438\u0434","last_name":"\u0414\u0435\u043c\u0438\u043d","username":"Livsi_MD_NN","type":"private"},"date":1716809660,"text":"\u0421\u0430\u0436\u0438 \u0447\u0438\u0441\u043b\u043e!"}
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x118 pc=0x12bcdb2]
goroutine 51 [running]:
main.botMain.func5(0xc0001844d0, {0x33dc95ba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...}, ...)
D:/Programming/GO/telego_bot/main.go:154 +0x32
github.com/mymmrac/telego/telegohandler.(*HandlerGroup).processUpdateWithMiddlewares(0xc0001f8200, 0xc0001844d0, {0x33dc95ba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...}, ...)
C:/Users/livsi/go/pkg/mod/github.com/mymmrac/[email protected]/telegohandler/handler_group.go:74 +0x283
github.com/mymmrac/telego/telegohandler.(*HandlerGroup).processUpdateWithMiddlewares(0xc0001f8100, 0xc0001844d0, {0x33dc95ba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...}, ...)
C:/Users/livsi/go/pkg/mod/github.com/mymmrac/[email protected]/telegohandler/handler_group.go:90 +0x3b0
github.com/mymmrac/telego/telegohandler.(*HandlerGroup).processUpdateWithMiddlewares.func1.1()
C:/Users/livsi/go/pkg/mod/github.com/mymmrac/[email protected]/telegohandler/handler_group.go:76 +0x92
sync.(*Once).doSlow(0x1351691?, 0xb?)
C:/Program Files/Go/src/sync/once.go:74 +0xc2
sync.(*Once).Do(...)
C:/Program Files/Go/src/sync/once.go:65
github.com/mymmrac/telego/telegohandler.(*HandlerGroup).processUpdateWithMiddlewares.func1(0x1327e00?, {0x33dc95ba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...})
C:/Users/livsi/go/pkg/mod/github.com/mymmrac/[email protected]/telegohandler/handler_group.go:75 +0x89
main.botMain.func4(0xc0001844d0, {0x33dc95ba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...}, ...)
D:/Programming/GO/telego_bot/main.go:148 +0xbf
github.com/mymmrac/telego/telegohandler.(*HandlerGroup).processUpdateWithMiddlewares(0xc0001f8100, 0xc0001844d0, {0x33dc95ba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...}, ...)
C:/Users/livsi/go/pkg/mod/github.com/mymmrac/[email protected]/telegohandler/handler_group.go:74 +0x283
github.com/mymmrac/telego/telegohandler.(*HandlerGroup).processUpdate(0xc0001f8100, 0x0?, {0x33dc95ba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...})
C:/Users/livsi/go/pkg/mod/github.com/mymmrac/[email protected]/telegohandler/handler_group.go:50 +0x9e
github.com/mymmrac/telego/telegohandler.(*BotHandler).Start.func1()
C:/Users/livsi/go/pkg/mod/github.com/mymmrac/[email protected]/telegohandler/bot_handler.go:100 +0x1e5
created by github.com/mymmrac/telego/telegohandler.(*BotHandler).Start in goroutine 1
C:/Users/livsi/go/pkg/mod/github.com/mymmrac/[email protected]/telegohandler/bot_handler.go:89 +0x165
exit status 2
Как append() влияет на len и cap слайса (slice) в Go?

Как функция append() влияет на длину (len) и вместимость (cap) слайса (slice) в гошке. Изменения cap слайса (slice) происходят нелинейно по отношению к количеству добавленных элементов. Почему изменяется cap среза после каждого вызова append?

Также возникает вопрос, можно ли этим как-нибудь управлять?

package main

import "fmt"

func main() {
// Создаем срез с начальной длиной 0 и вместимостью 3
slice := make([]int, 0, 3)
fmt.Printf("Initial len: %d, cap: %d\n", len(slice), cap(slice)) // len: 0, cap: 3

// Добавляем первый элемент в срез
slice = append(slice, 1)
fmt.Printf("After append 1: len: %d, cap: %d\n", len(slice), cap(slice)) // len: 1, cap: 3

// Добавляем второй элемент в срез
slice = append(slice, 2)
fmt.Printf("After append 2: len: %d, cap: %d\n", len(slice), cap(slice)) // len: 2, cap: 3

// Добавляем третий элемент в срез
slice = append(slice, 3)
fmt.Printf("After append 3: len: %d, cap: %d\n", len(slice), cap(slice)) // len: 3, cap: 3

// Добавляем четвертый элемент, что приводит к увеличению вместимости среза
slice = append(slice, 4)
// Здесь cap может удвоиться до 6, но точное значение может зависеть от реализации
fmt.Printf("After append 4: len: %d, cap: %d\n", len(slice), cap(slice)) // len: 4, cap: 6
}
проблема с import в GO

Я только учусь и не хочу понять как это работает. У меня есть 2 файла c названиями main.go и testBD.go они находятся в одной папке и поэтому в начале этих файлов написал package main В файле testBD.go содержится функция для генерации слайса с элементами чисел от 0 до 500:

package main

func GenSlice(testSlice []int) []int {
resSlice := testSlice
for i := 0; i < 500; i++ {
resSlice = append(resSlice, i)
}
return resSlice
}

func main() {
nowTime := time.Now()
nums := []int{}
fmt.Println(GenSlice(nums))
afterTime := time.Now().Sub(nowTime)
fmt.Println("Времени ушло", afterTime)
}
в функции main() я просто проверял время работы цикла А в файле main.go есть следующий код:

package main

import (
"fmt"
)

func main() {
nums := []int{}
fmt.Println(GenSlice(nums))
}
Я ожидал увидеть просто вывод чисел в слайсе от 0 до 499 но получаю ошибку
# command-line-arguments .\main.go:9:14: undefined: GenSlice
Гарантия доставки сообщений

Есть веб-приложение на React, которое регулярно обновляет данные с сервера, написанного на Go. Я использую setInterval для выполнения HTTP-запросов каждую минуту. Я переживаю о производительности и нагрузке на сервер. Существуют ли более эффективные методы для поддержания актуальности данных?

Минимальный пример:

package main

import (
"encoding/json"
"net/http"
"time"
)

type Data struct {
Message string json:"message"
}

func handler(w http.ResponseWriter, r *http.Request) {
data := Data{Message: "Hello, World!"}
json.NewEncoder(w).Encode(data)
}

func main() {
http.HandleFunc("/data", handler)
http.ListenAndServe(":8080", nil)
}
Приложение на реакте:

import React, { useEffect, useState } from "react";

function App() {
const [data, setData] = useState(null);

useEffect(() => {
const fetchData = async () => {
const response = await fetch("http://localhost:8080/data");
const result = await response.json();
setData(result);
};

fetchData();
const interval = setInterval(fetchData, 60000); // Обновление данных каждую минуту

return () => clearInterval(interval);
}, []);

return (
<div>
<h1>{data ? data.message : "Loading..."}</h1>
</div>
);
}

export default App;
Как отсортировать map по порядку, указанному в массиве ключей?


Есть map, а точнее map[string]int

По умолчанию, как я понял, Golang сортирует элементы по ключу в алфавитном порядке. А как отсортировать map по ключам в заданном порядке?

Этот код:

package main

import (
"fmt"
)

func main() {
output := make(map[string]int)

basket := map[string]int{
"orange": 5,
"apple": 7,
"mango": 3,
"strawberry": 9,
}

//нужный порядок
keys := []string{
"strawberry",
"mango",
"orange",
}

for _, k := range keys {
output[k] = basket[k]
}

fmt.Printf("вывод output : %+v \n", output)
}
выдаст с ключами строки в алфавитном порядке:

mango, orange, strawberry
Pаспознавания адресов/геоданных из текста


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

Какие есть проверенные методы, библиотеки или подходы для решения подобной задачи? Интересуют варианты на различных языках программирования (особенно Python), включая машинное обучение и регулярные выражения. Буду благодарен за любые советы, рекомендации или ссылки на готовые решения!
Выдает ошибку при решении задачи на Golang

Условие задачи:

Дан неотсортированный слайс целых чисел. Напишите функцию UnderLimit(nums []int, limit int, n int) ([]int, error), которая будет возвращать первые n (либо меньше, если остальные не подходят) элементов, которые меньше limit. В случае ошибки функция должна вернуть nil и описание ошибки.

TEST`s

package main

import (
"slices"
"testing"
)

func TestUnderLimit(t *testing.T) {
type test struct {
nums []int
n int
limit int
expected []int
wantError bool
}

tests := []test{
{
nums: []int{4, 7, 89, 3, 21, 2, 5, 7, 32, 4, 6, 8, 0, 3, 4, 6, 2, 115, 12},
n: 5,
limit: 3,
expected: []int{2, 0, 2},
wantError: false,
},
{
nums: nil,
wantError: true,
},
{
nums: []int{},
n: 5,
limit: 3,
expected: []int{},
wantError: false,
},
{
nums: []int{3, 5, 6},
n: 5,
limit: 10,
expected: []int{3, 5, 6},
wantError: false,
},
{
nums: []int{-13, 0, 6},
n: 1,
limit: -5,
expected: []int{-13},
wantError: false,
},
{
nums: []int{},
n: -1,
limit: 5,
wantError: true,
},
}

for _, tc := range tests {
result, err := UnderLimit(tc.nums, tc.limit, tc.n)
if tc.wantError {
if err == nil {
t.Fatalf("expec... File is too long to be displayed fully
Моё решение:

func UnderLimit(nums []int, limit int, n int) ([]int, error) {
if n < 0 {
return nil, fmt.Errorf("n cannot be negative")
} else if n == 0 {
result := make([]int, 0, 0)
return result, nil
}

result := make([]int, 0, n)
count := 0
for _, num := range nums {
if num < limit {
result = append(result, num)
count++
}
if count == n {
return result, nil
}
}
return result, nil
}
Но выводится ошибка:

--- FAIL: TestUnderLimit (0.00s)
source_test.go:62: expected an error
FAIL
HTTPS запрос к серверам VK для загрузки видео


Пишу код для загрузки видео из VK без использования VK API. Задача стоит следующая: брать ссылку на видео, далее отправить запрос по этому URL и получить в ответ страницу с просмотром этого видео. То есть симулировать запрос от реального браузера.

Для этого я попробовал скопировать все header'ы из запроса реального браузера следующим образом:

req, err := http.NewRequest("GET", URL, nil)

req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 YaBrowser/24.7.0.0 Safari/537.36")
req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7")
req.Header.Set("Accept-Encoding", "gzip, deflate, br, zstd")
req.Header.Set("Accept-Language", "ru,en;q=0.9")
req.Header.Set("Cache-Control", "max-age=0")

req.Header.Set("Sec-Ch-Ua", "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"YaBrowser\";v=\"24.7\", \"Yowser\";v=\"2.5\"")
req.Header.Set("Sec-Ch-Ua-Mobile", "?0")
req.Header.Set("Sec-Ch-Ua-Platform", "\"macOS\"")
req.Header.Set("Sec-Fetch-Dest", "document")
req.Header.Set("Sec-Fetch-Mode", "navigate")
req.Header.Set("Sec-Fetch-Site", "same-origin")

req.Header.Set("Upgrade-Insecure-Requests", "1")

req.Header.Set("Priority", "u=0, I")
В ответ ожидал увидеть страницу с видео для дальнейшей работы, но фактически пришла страница, в которой мне предлагают обновить/установить свежую версию браузера.
Вопрос в следующем: как я могу эмулировать запрос от «современного» браузера в Go?

Полный код выглядит следующим образом:

const URL = "https://m.vk.com/video-85466065_456241727"

req, err := http.NewRequest("GET", URL, nil)

req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 YaBrowser/24.7.0.0 Safari/537.36")
req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7")
req.Header.Set("Accept-Encoding", "gzip, deflate, br, zstd")
req.Header.Set("Accept-Language", "ru,en;q=0.9")
req.Header.Set("Cache-Control", "max-age=0")

req.Header.Set("Sec-Ch-Ua", "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"YaBrowser\";v=\"24.7\", \"Yowser\";v=\"2.5\"")
req.Header.Set("Sec-Ch-Ua-Mobile", "?0")
req.Header.Set("Sec-Ch-Ua-Platform", "\"macOS\"")
req.Header.Set("Sec-Fetch-Dest", "document")
req.Header.Set("Sec-Fetch-Mode", "navigate")
req.Header.Set("Sec-Fetch-Site", "same-origin")

req.Header.Set("Upgrade-Insecure-Requests", "1")

req.Header.Set("Priority", "u=0, i")

client := &http.Client{}

res, err := client.Do(req)
Не запускается файл с кодом

Устаналивал VS Code и сопутствующие дополнения к нему по инструкции яндекс-лицея, при попытке запуска кода через команду go run test.go выдает ошибку:

go : Имя "go" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после чего повторите попытку.
Получение структуры по ключу из Redis Golang


Имею подобную структуру

type myStruct struct {
TotalCount int json:"inventory_total_count"
TotalPrice int json:"inventory_total_price"
GameList []string json:"game_list"
UserInfo UserInformation json:"user_info"
GameInventory map[string]InventoryGame json:"inventory"
}

type InventoryGame struct {
GameAssetsTotalCount int json:"game_assets_total_count"
GameAssetsTotalPrice int json:"game_assets_total_price"
GameID string json:"gameid"
Assets []InventoryAssets json:"assets"
}

type InventoryAssets struct {
ClassID string json:"classid"
InstanceID string json:"instanceid"
IconURL string json:"icon_url"
Name string json:"name"
MarketHashName string json:"market_hash_name"
AssetRarity string json:"rarity"
AssetBorderColor string json:"border_color"
AssetExterior string json:"exterior"
AssetQuality string json:"asset_quality"
AppID int json:"appid"
AssetPrice int json:"asset_price"
Marketable int json:"marketable"
AssetCount int json:"item_count"
AssetTotalCost int json:"asset_total_price"
}
после того как ее создаю я, записываю в хранилище Redis следующим образом

err := client.Set(ctx, "key", myStruct, time.Minute)
// отработка err
далее я пытаюсь достать данную структуру следующим образом

newStruct := myStruct{}
err := client.Get(ctx, "key").Scan(&newStruct)
// отработка err
в итоге на выходе получается пустая структура

{0 0 [] { } map[]}
ps. методы структуры "MarshalBinary" и "UnmarshalBinary" прописаны.

Использую go-redis/v9.

Как мне правильно достать структуру из хранилища редис?
Как исключить зависимость для определенной ос?

Написал программу у которой есть функционал вызова диалога выбора файла через 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? Что я делаю не так? Заранее спасибо!
Что делают в коде %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 инфо к моменту написания вопроса не нашел.
Неблокирующий канал с буфером


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

Есть рутина, которая запускает консольную утилиту и парсит её вывод. Данные идут порциями, их частота от меня никак не зависит. Может быть 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. А как добиться от этого кода ответа на поставленный вопрос?