Search code examples
gostructgo-templatesgo-html-template

Simple if not working go template


So I am doing a simple if check on a bool from a struct but it doesn't seem to work, it just stop rendering the HTML.

So the following struct is like this:

type Category struct {
    ImageURL      string
    Title         string
    Description   string
    isOrientRight bool
}

Now I have a slice of that Category struct which I get to display with a range.

Bellow is an example of one struct:

juiceCategory := Category{
    ImageURL: "lemon.png",
    Title:    "Juices and Mixes",
    Description: `Explore our wide assortment of juices and mixes expected by
                        today's lemonade stand clientelle. Now featuring a full line of
                        organic juices that are guaranteed to be obtained from trees that
                        have never been treated with pesticides or artificial
                        fertilizers.`,
    isOrientRight: true,
}

I've tried multiple ways, like below, but none of them worked:

{{range .Categories}}
    {{if .isOrientRight}}
       Hello
    {{end}}
    {{if eq .isOrientRight true}}
       Hello
    {{end}}

   <!-- Print nothing -->
   {{ printf .isOrientRight }} 

{{end}}

Solution

  • You have to export all the fields you want to access from templates: change its first letter to capital I:

    type Category struct {
        ImageURL      string
        Title         string
        Description   string
        IsOrientRight bool
    }
    

    And every reference to it:

    {{range .Categories}}
        {{if .IsOrientRight}}
           Hello
        {{end}}
        {{if eq .IsOrientRight true}}
           Hello
        {{end}}
    
       <!-- Print nothing -->
       {{ printf .IsOrientRight }} 
    
    {{end}}
    

    Every unexported field can only be accessed from the declaring package. Your package declares the Category type, and text/template and html/template are different packages, so you need to export it if you want those packages to have access to it.

    Template.Execute() returns an error, should you have stored / examined its return value, you would have found this out immediately, as you'd get an error similar to this one:

    template: :2:9: executing "" at <.isOrientRight>: isOrientRight is an unexported field of struct type main.Category

    See a working example of your code on the Go Playground.