Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Golang struct array values not appending In loop

This is my code:

package main

import(
    "fmt"
)

type Category struct {
    Id   int
    Name string
}

type Book struct {
    Id         int
    Name       string
    Categories []Category
}

func main() {
    var book Book

    book.Id = 1
    book.Name = "Vanaraj"

    for i := 0; i < 10; i++ {
        book.Categories = []Category{
            {
                Id : 10,
                Name : "Vanaraj",
            },
        }
    }

    fmt.Println(book)
}

I need to append the values to the categories. The values are appending only one time. But I need to append the values to the array.

How to fix this?

like image 331
vanarajcs Avatar asked Dec 17 '15 08:12

vanarajcs


1 Answers

You are not appending anything to book.Categories, in each iteration of the for loop you always create a new slice with a composite literal and you assign it to book.Categories.

If you want to append values, use the builtin append() function:

for i := 0; i < 10; i++ {
    book.Categories = append(book.Categories, Category{
        Id:   10,
        Name: "Vanaraj",
    })
}

Output (try it on the Go Playground):

{1 Vanaraj [{10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj}]}

Also note that if you know the iteration count in advance (10 in your case), you can create a big-enough slice beforehand, you can use for ... range and just assign values to the proper element without calling append(). This is more efficient:

book.Categories = make([]Category, 10)
for i := range book.Categories {
    book.Categories[i] = Category{
        Id:   10,
        Name: "Vanaraj",
    }
}
like image 71
icza Avatar answered Nov 14 '22 12:11

icza