Функция не принимает и не возвращает структуру?

Привет. Кратко: функция 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 часов поиска решения я перепробовал много вариантов синтаксиса и уловок.
Могу дать ссылку на весь код в гит, если надо.
Спасибо
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
@12rbah
Честно говоря не совсем понял почему в коде вы показываете что передаёте st []struct{} и возвращаете struct{}, нужно указывать конкретный тип данных. Вот рабочий код
package main

import (
	"fmt"
	"math/rand"
	"time"
)

type WordsStruct struct {
	Id    int
	Fword string
	Sword string
	Freq  int
}

func Next(st []WordsStruct) WordsStruct {
	rand.Seed(time.Now().Unix())
	shw := st[rand.Intn(len(st))]
	return shw
}

func main(){
	st := []WordsStruct{
		{Id: 1, Fword: "test", Sword:"est" , Freq:5 },
		{Id: 2, Fword: "rest", Sword:"ww" , Freq:75 },
	}
	fmt.Println(Next(st))
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы