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
оттуда — тогда окно не закроется автоматически.
вот поэтому вы и вайбкодер
Уровень ваших выводов здесь уже давно известен. Я вот только только не уверен, что он дотягивает до уровня дет. сада.
Забыли еще кстати, что поэтому и хромаю и поэтому глаза стали квадратными
Я так понимаю, что вы себя мните на другом конце, мне вот только интересно как вы это называете? Что то типа "ручное программирование каменного века"?