Получение структуры по ключу из Redis Golang
Имею подобную структуру
type myStruct struct {
TotalCount int
TotalPrice int
GameList []string
UserInfo UserInformation
GameInventory map[string]InventoryGame
}
type InventoryGame struct {
GameAssetsTotalCount int
GameAssetsTotalPrice int
GameID string
Assets []InventoryAssets
}
type InventoryAssets struct {
ClassID string
InstanceID string
IconURL string
Name string
MarketHashName string
AssetRarity string
AssetBorderColor string
AssetExterior string
AssetQuality string
AppID int
AssetPrice int
Marketable int
AssetCount int
AssetTotalCost int
}
после того как ее создаю я, записываю в хранилище 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.
Как мне правильно достать структуру из хранилища редис?
Имею подобную структуру
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 файл
Написал программу у которой есть функционал вызова диалога выбора файла через 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? Что я делаю не так? Заранее спасибо!
Коллеги, помогите разобраться. Вопрос избитый, но решить по ссылкам в сети пока не получилось (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 инфо к моменту написания вопроса не нашел.
У нас есть программа по угадыванию числа. Не понимаю что в ней выполняют символы %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 элементов - самое старое значение удаляется, новое добавляется), а при чтении - блокировал (при отсутствии данных).
Станадртный буферизированный канал не подходит - при заполненном буфере он блокирует запись.
Так как в го я новичок - трудно сообразить как такое наколхозить. Попробовал поискать по репам/гуглу - ничего похожего найти не могу.
Подскажите, куда копать, где можно подсмотреть что-то похожее?
Помогите сообразить, как сделать следующее, желательно в "го-стиле".
Есть рутина, которая запускает консольную утилиту и парсит её вывод. Данные идут порциями, их частота от меня никак не зависит. Может быть 10+ пакетов в секунду, может 1. Вторая рутина должна брать эти пакеты, немного их обработать и отправить на внешний веб-сервис.
Изначально идея была - делаем канал между этими двуми рутинами. Парсим пакет - записываем в канал - читаем с канала - отправляем. Всё хорошо, пока связь стабильная и быстрая. Как только связь теряется, тормозит - начинается затык. Данные сыпятся быстрее, чем мы можем их отправлять. Важно, что потеря части данных не критична, главное чтобы последние N пакетов держались в памяти и по возможности отправлялись.
Напрашивается что-то типа очереди с автоматическим удалением старых элементов при превышении лимита N. Первая горутина туда кладёт, вторая оттуда достаёт.
То есть другими словами, нужно сделать такой канал с буфером, который бы при записи в него не блокировал (если в канале уже N элементов - самое старое значение удаляется, новое добавляется), а при чтении - блокировал (при отсутствии данных).
Станадртный буферизированный канал не подходит - при заполненном буфере он блокирует запись.
Так как в го я новичок - трудно сообразить как такое наколхозить. Попробовал поискать по репам/гуглу - ничего похожего найти не могу.
Подскажите, куда копать, где можно подсмотреть что-то похожее?
Как выбрать файл через системный проводник?
В программе понадобилось открыть проводник и выбрать в нем файл. Как я вижу использование: при работе в терминальной программе я могу ввести опрелеленную комманду и откроется системный проводник в котором можно выбрать файл. После выбора файла в проводнике, в терминальную программу копируется путь к выбранному файлу, а проводник молча закрывается. Далее над файлом по пути осуществляются какие то действия в коде. Как это(открытие прводника и выбор в нем файла) реализовать средствами go? Пишу код и тестирую в debian, соответственно решение необходимо под unix в первую очередь
В программе понадобилось открыть проводник и выбрать в нем файл. Как я вижу использование: при работе в терминальной программе я могу ввести опрелеленную комманду и откроется системный проводник в котором можно выбрать файл. После выбора файла в проводнике, в терминальную программу копируется путь к выбранному файлу, а проводник молча закрывается. Далее над файлом по пути осуществляются какие то действия в коде. Как это(открытие прводника и выбор в нем файла) реализовать средствами 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. А как добиться от этого кода ответа на поставленный вопрос?
Я чайник и пытаюсь потрогать 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.
Сделал небольшое консольное приложение на 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.
Что произойдёт, если мьютекс заблокирован, но горутина завершится до вызова Unlock?
Anonymous Poll
21%
Мьютекс автоматически разблокируется
15%
Программа завершится с ошибкой
67%
Мьютекс останется заблокированным навсегда
⁉️ Что будет при делении целого отрицательного числа на ноль в Go?
Anonymous Poll
6%
Вернётся бесконечность
83%
Произойдет паника
8%
Вернётся отрицательная бесконечность
6%
Вернётся ноль
Когда деление на ноль в Go НЕ приводит к панике?
Anonymous Poll
46%
Никогда
5%
При делении целого числа на ноль
38%
При работе с числами с плавающей запятой
14%
Каждый вторник и четверг
Можно ли использовать тип interface{} в качестве ключа в мапе?
Anonymous Poll
28%
Да, в любом случае
20%
Да, если интерфейс не пустой
53%
Нет
Какие объекты очищаются сборщиком мусора?
Anonymous Poll
4%
Все объекты в памяти
94%
Объекты, на которые больше нет ссылок
5%
Только объекты в стеке
2%
Объекты с размером более 25 Мб
Что делает параметр GOGC?
Anonymous Poll
5%
Увеличивает объём стека
81%
Регулирует частоту вызова GC
13%
Очищает все объекты в памяти
4%
Ускоряет работу горутин
Какие этапы включает работа GC?
Anonymous Poll
45%
Маркировка, Компактирование, Очистка
17%
Выделение, Проверка, Удаление
39%
Маркировка, Очистка, Компактирование
4%
Трассировка, Кэширование, Удаление
❓Какой из следующих вариантов НЕ является типичной задачей для go vet?
Anonymous Poll
10%
Проверка использования неправильных форматов в fmt.Printf
7%
Поиск неиспользуемых переменных
79%
Оценка производительности программы
9%
Поиск недостающих или лишних аргументов в вызовах функций
Почему массив arr остался или не остался изменённым?
Anonymous Poll
9%
Срезы всегда создают копию массива
9%
Append всегда создаёт новый массив
59%
Срезы ссылаются на тот же массив, и append может изменить массив, если у среза достаточно емкости
38%
Массивы в Go неизменяемы