Привет. Кратко: функция MainPage обрабатывает главную страницу а так же выгружает таблицу из БД в слайс из структур.
Далее Из этого слайса структур берется случайный объект, назначается переменной show, которая передается на страницу для вывода данных из БД.
type WordsStruct struct {
Id int
Fword string
Sword string
Freq int
}
func MainPage(w http.ResponseWriter, r *http.Request) {
m, _ := template.ParseFiles("html/main.html", "html/header.html", "html/footer.html")
res, err := database.Query(fmt.Sprintf("SELECT * FROM `words`"))
if err != nil {
panic(err)
}
defer res.Close()
showarray := []WordsStruct{}
for res.Next() {
var sw WordsStruct
err := res.Scan(&sw.Id, &sw.Fword, &sw.Sword, &sw.Freq)
if err != nil {
fmt.Println(err)
continue
}
showarray = append(showarray, sw)
}
rand.Seed(time.Now().Unix())
show := showarray[rand.Intn(len(showarray))]
//w.Header().Set("Content-Type", "text/html")
m.ExecuteTemplate(w, "main", show)
}
Далее юзер жмет на странице кнопку "Далее" и видит следующую рандомную структуру из слайса.
Весь костыль завязан на том, что при нажатии на "Далее" страница обновляется и код исполняется заново.
Т.е. для оптимизации необходимо вывести в отдельную функцию извлечение случайного объекта из слайса структур.
Значит вместо кода с рандомизацией:
rand.Seed(time.Now().Unix())
show := showarray[rand.Intn(len(showarray))]
надо вызывать функцию с этой операцией, в аргумент которой кладем слайс структур, а возвращаем рандомный объект-структуру, который отправляется на страницу:
show := Next(showarray)
// ***
func Next(st []struct{}) struct{} {
rand.Seed(time.Now().Unix())
shw := st[rand.Intn(len(st))]
return shw
}
Но самая частая ошибка: либо нельзя передавать структуру как аргумент, либо нельзя возвращать.
За 7 часов поиска решения я перепробовал много вариантов синтаксиса и уловок.
Могу дать ссылку на весь код в гит, если надо.
Спасибо