@Nube

Как заполнить вложенную структуру данными?

Я пытаюсь сделать пост в котором отображается несколько изображений .Проблема в том что если с одной картинкой норм то с несколькими облом.
Имеется структура
type Post struct {
	ID   		        int
	Rating		int
	Title		        string
	Description      string
	Author     	string
	Images		*[]ImagePost
}

type ImagePost struct {
	ImageNumber	int
	ImageLink  	string
}

заполнить ее пытаюсь таким методом
var (
	
   	index = make(map[int]*model.Post)
	name = "TestPost"
)
  func DataIndexPage() *(map[int]*model.Post) {
	result, err := db.Query(sqlNamePost,name)
	if err != nil {
		log.Println(err)
	}

	// Slice
	posts := make([]*model.Post,0)
	imgs  := make([]*model.ImagePost,0)

	for result.Next() {
		post := new(model.Post)
		img  := new(model.ImagePost)
		err  := result.Scan(&post.ID,&post.Title,&post.Description,&post.Rating,&post.Author,&img.ImageNumber,&img.ImageLink)

		if err != nil{
			fmt.Println(err,"Gero")
			continue
		}
		imgs  = append(imgs,img)
		posts = append(posts,post)
		
	}

	
	//Cycle for
	for _, post := range posts{
		index[post.ID] = post
	}
	return &index

}


сам шаблон выглядит так
{{define "postList"}}
<div class="post-list">

    {{range $key, $value:=.}}
    <div class="post" id="{{$value.ID}}">
        <div class="post-rating">
            <p>Rating:{{$value.Rating}}</p>
        </div>
        <div class="post-body">
            <div class="post-content">
                <div class="post-content-image-block">
                        //Тут я пытаюсь пробежаться по структуре ImagePost
                        {{range .Images}}
                    <img src="{{.ImageLink}}" width="600" height="550">
                        {{end}}
                    <p>Title:{{$value.Title}}</p>
                </div>
                <div class="post-content-description-block">
                    <p>Description:{{$value.Description}}
                </div>
                <div class="post-footer">
                    <div class="post-tools">

                    </div>
                    <div class="post-author">
                        Author:{{$value.Author}}
                    </div>
                </div>
            </div>
        </div>
    </div>
    {{end}}
</div>
 {{end}}

У меня появляется ошибка ""postList" at <.Images>: range can't iterate over " И действительно поля ImagePost пусты, хотя я искусственно заполнял Post без БД, и все работало !
Уже как день пытаюсь,но не получается((
  • Вопрос задан
  • 730 просмотров
Решения вопроса 2
Вижу, что у вас добавляются изображения в массив imgs, но не вижу, чтобы они добавлялись в поле Images у объектов типа Post.
Ну и ещё у вас поле Images является указателем на слайс объектов типа ImagePost, вам его надо разыменовать перед тем, как итерироваться по нему. Или просто убрать указатель отуда и сделать просто:
type Post struct {
..........................
    Images		[]ImagePost
}
Ответ написан
@Nube Автор вопроса
Благодаря наводки Александра я изменил код на следующий
func DataIndexPage() *(map[int]*model.Post) {
	result, err := db.Query(sqlNamePost,name)
	if err != nil {
		log.Println(err)
	}

	// Slice
	posts := make([]*model.Post,0)
	imgs  := make([]model.ImagePost,0)

	post := new(model.Post)
	img  := model.ImagePost{}

	for result.Next() {

		err  := result.Scan(&post.ID,&post.Title,&post.Description,&post.Rating,&post.Author,&img.ImageNumber,&img.ImageLink)

		if err != nil{
			fmt.Println(err,"Gero")
			continue
		}

		imgs = append(imgs,img)
	//	post.Images = append(post.Images,img)
		posts = append(posts,post)



	}

	if err = result.Err(); err != nil {
		log.Println(err)

	}
	//Cycle for
	for _, img := range imgs{
		post.Images = append(post.Images,img)
	}
	for _, post := range posts{
		index[post.ID] = post
	}
	return &index

}

И все заработало, если есть лучше способ будет круто!
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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