Golang. Как найти нужный String ?
Вчера открыла для себя Golang, в голове ещё завалялись знания прошлого тысячилетия по программированию.Мечтаю сделать Vokabeltrainer.
1) Как обыскать имеющиеся String и сравнить место 0 с введенным словом? Например andare[0]==wahl1
2) Вообще как лучше сделать базу данных, слов будет около сотни.
3) Как сделать программу с кнопками и окнами? Для Windows und Android.
package main
import ("fmt")
func main() {
avere = [14]string{"avere", "ho", "hai", "ha", "abbiamo", "avete", "hanno", "avrò", "avrai", "avrà", "avremo", "avrete", "avranno", "haben"}
essere = [14]string{"èssere", "sono", "sei", "è", "siamo", "siete", "sanno", "sarò", "sarai", "sarà", "saremo", "sarete", "saranno", "sein"}
andare = [14]string{"andare", "vado", "vai", "va", "andiamo", "andate", "vanno", "andrò", "andrai", "andrà", "andremo", "andrete", "andranno", "gehen oder fahren"}
var wahl1 string
var wahl2 int
fmt.Println("Wählen Sie aus: avere éssere andare")
fmt.Scanln(&wahl1)
fmt.Println("Wählen Sie aus: Presente: 1, Futuro semplice: 7")
fmt.Scanln(&wahl2) // erste Stelle, letzte Stelle= wahl2+5
}
на форуме подобные вещи можно уже не спрашивать, а вести диалог с помощником:
✅ 1. Как сравнить andare[0] == wahl1
В Go массивы и срезы (slice
) работают просто. Чтобы сравнить первый элемент массива со строкой wahl1
, достаточно:
if andare[0] == wahl1 {
fmt.Println("Вы выбрали глагол andare")
}
Но ваш код не компилируется, потому что переменные avere
, essere
, andare
не объявлены. Нужно использовать :=
или var
:
avere := [14]string{...}
essere := [14]string{...}
andare := [14]string{...}
Или лучше — использовать map:
verbs := map[string][14]string{
"avere": {...},
"essere": {...},
"andare": {...},
}
Тогда можно легко обращаться:
if val, ok := verbs[wahl1]; ok {
fmt.Println("Вы выбрали:", val[0])
}
📦 2. Как лучше хранить ~100 слов
Для небольшого количества слов можно:
🔹 Вариант A: JSON-файл
Создайте файл vocab.json
:
{
"avere": ["avere", "ho", "hai", ...],
"essere": ["essere", "sono", "sei", ...]
}
И загрузите его в Go:
import (
"encoding/json"
"os"
)
var verbs map[string][]string
file, _ := os.ReadFile("vocab.json")
json.Unmarshal(file, &verbs)
🔹 Вариант B: SQLite
Если хотите расширяться — используйте SQLite с библиотекой mattn/go-sqlite3. Это даст гибкость: фильтрация, сортировка, статистика.
🖱️ 3. Как сделать GUI с кнопками и окнами
🔸 Для Windows:
- Используйте Fyne — кроссплатформенный GUI-фреймворк на Go.
- Пример:
package main
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("Vokabeltrainer")
entry := widget.NewEntry()
button := widget.NewButton("Suchen", func() {
fmt.Println("Вы ввели:", entry.Text)
})
w.SetContent(widget.NewVBox(entry, button))
w.ShowAndRun()
}
🔸 Для Android:
- Go не поддерживает Android напрямую, но можно:
- Написать backend на Go и frontend на Kotlin/Java.
- Или использовать gomobile (ограничено).
- Альтернатива: сделать Web-приложение на Go + HTML/JS и открыть его в WebView на Android.
💡 Бонус: структура проекта
vokabeltrainer/
├── main.go
├── vocab.json
├── gui/ # если используете Fyne
├── db/ # если используете SQLite
└── assets/ # картинки, звуки
на форуме подобные вещи можно уже не спрашивать, а вести диалог с помощником:
из помощников книга "Го для чайников".
if val, ok := verbs[wahl1]; ok
можно это разжувать? что такое if понятно.
func main() {
fmt.Println("Wählen Sie aus: avere andare bere èssere fare") fmt.Scanln(&w1)
fmt.Println("Wählen Sie aus: Presente-1, Futuro semplice-7") fmt.Scanln(&anfang)meinVerb(w1, anfang)
ausgabe()
eingabe()
auswertung()}
если запускаю в VisualStudio, то всё работает, auswertung() до конца всё делает. если запускаю .exe, то окно закрывается само после выполнения eingabe()
что не так?
Да чего вы в айти все лезете? Нет тут больших денег уже, а в Германии и вообще никогда не было. Идите в иммобилиен маклеры - одна сделка кормит вас весь месяц, а то и два.
на форуме подобные вещи можно уже не спрашивать
Если не спрашивать хотя бы такие вещи, то форум загнётся. Щас хоть ИИшников гонять можно, насмехаться над ними, а раньше вообще тут мертвяк был.
из помощников книга "Го для чайников".
помощники в наше время уже другие, гляньте пару страниц самой долгоиграющей темы здесь
if val, ok := verbs[wahl1]; ok
Эта конструкция типична для Go и называется "comma ok idiom" — используется при проверке наличия ключа в map.
🧩 Разбор строки
if val, ok := verbs[wahl1]; ok {
// тело if
}
🔧 Что такое verbs[wahl1]
?
verbs
— это map, то есть словарь:map[string]string
илиmap[string]VerbStruct
, например.wahl1
— это ключ, который ты получил от пользователя.verbs[wahl1]
— попытка получить значение по ключуwahl1
.
🧠 Что делает val, ok := verbs[wahl1]
?
val
— значение, которое хранится по ключуwahl1
, если он есть.ok
— булево значение (true
илиfalse
), которое показывает, нашёлся ли ключ.
🔍 Как это работает
- Если
wahl1
есть вverbs
, то:val
будет значением из словаря.ok
будетtrue
.
- Если
wahl1
нет вverbs
, то:val
будет нулевым значением (например,""
илиnil
).ok
будетfalse
.
✅ Пример
verbs := map[string]string{
"avere": "haben",
"essere": "sein",
}
wahl1 := "avere"
if val, ok := verbs[wahl1]; ok {
fmt.Println("Gefunden:", val)
} else {
fmt.Println("Nicht gefunden")
}
Вывод:
Gefunden: haben
Если бы wahl1 := "fare"
, то было бы:
Nicht gefunden
🧠 Почему это удобно?
- Без
ok
, ты не узнаешь, есть ли ключ — и можешь случайно работать сnil
или пустыми значениями. - Это безопасный способ обращаться к map.
если запускаю в VisualStudio, то всё работает, auswertung() до конца всё делает. если запускаю .exe, то окно закрывается само после выполнения eingabe()что не так?
главное забудьте немецкий для программирования и учите английский.
🧨 Почему .exe
закрывается сразу?
Когда запускаешь .exe
напрямую (двойной клик), консоль открывается, выполняет программу, и сразу закрывается, как только main()
завершился.
Если eingabe()
— это последний ввод, и после него auswertung()
завершает работу, то окно консоли просто закрывается, не давая увидеть результат.
✅ Как это исправить
Добавь ожидание ввода в конце, чтобы окно не закрылось сразу:
fmt.Println("Drücken Sie die Eingabetaste zum Beenden...")
fmt.Scanln()
Или просто:
var dummy string
fmt.Scanln(&dummy)
Это заставит программу ждать, пока ты нажмёшь Enter — и окно не закроется сразу.
🛠 Альтернатива: запуск через cmd
Если ты хочешь запускать .exe
и видеть результат, открой командную строку (cmd) вручную и запусти .exe
оттуда — тогда окно не закроется автоматически.
Если не спрашивать хотя бы такие вещи, то форум загнётся.
так уже и загнулся, гораздо проще обсудить всё немедленно и сразу, чем ждать ответа на форуме
Да кончайте вы эти дурацкие картинки копировать!
И форум этот дурацкий. Позволяет вставлять их со всем форматированием.
давать Вам тексты на проверку, чтобы сами всё удаляли? Если не забуду попрошу без картинок, но мне нравится с картинками
Вы пробовали программировать на Лабвью, блупринтах или создавать иерархии классов в UML с нуля? Может вам оно лучше зайдёт, чем текст?
вот поэтому вы и вайбкодер
Уровень ваших выводов здесь уже давно известен. Я вот только только не уверен, что он дотягивает до уровня дет. сада.
Забыли еще кстати, что поэтому и хромаю и поэтому глаза стали квадратными
Я так понимаю, что вы себя мните на другом конце, мне вот только интересно как вы это называете? Что то типа "ручное программирование каменного века"?
хромаю и глаза стали квадратными
Не знал о вас таких подробностей. Сочувствую.
Я так понимаю, что вы себя мните на другом конце, мне вот только интересно как вы это называете? Что то типа "ручное программирование каменного века"?
юрского периода