Maison >développement back-end >Golang >Aller au modèle si condition

Aller au modèle si condition

王林
王林avant
2024-02-06 11:24:13429parcourir

Go 模板 if 条件

Contenu de la question

Comment combiner andeq/ne fonctions ensemble ?

J'ai écrit ce clip

{{ define "opsgenie.default.tmpl" }}
  <font size="+0"><b>{{.commonlabels.alertname }}</b></font>
  {{- range $i, $alert := .alerts }}
  <font size="+0">{{ .annotations.description }}</font>
  {{- end -}}
  {{- "\n" -}}
  {{- "\n" -}}
  {{- if and eq .commonlabels.infoalert "true" eq .commonlabels.topic "database" -}}
  grafana: https://{{ .commonlabels.url }}
  {{- "\n" -}}{{- end -}}
  {{- if and ne .commonlabels.infoalert "true" eq .commonlabels.topic "database" -}}
  database:
    • https://{{ .commonlabels.url }}/
    • https://{{ .commonlabels.url }}/
  {{- "\n" -}}{{- end -}}
  {{- end -}}
  {{- end -}}
{{- end -}}

L'objectif est :

  • Si mon alerte contient deux libellés infoalert: truetopic:database seul le lien grafana est affiché
  • Si mon alerte ne contient que des tags topic: database 但不包含 infoalert: true alors seul le lien databsse sera affiché

Il semble que la syntaxe du conditionnel {{- if and eq .commonlabels.infoalert "true" eq .commonlabels.topic "database" -}} soit incorrecte car j'obtiens cette erreur dans alertmanager.log lorsque l'alerte est déclenchée :

notify retry canceled due to unrecoverable error after 1 attempts: templating error: template: email.tmpl:24:17: executing \"opsgenie.default.tmpl\" at <eq>: wrong number of args for eq: want at least 1 got 0

Bonne réponse


Utilisez simplement des parenthèses pour regrouper les expressions :

{{- if and (eq .commonlabels.infoalert "true") (eq .commonlabels.topic "database") -}}

{{- if and (ne .commonlabels.infoalert "true") (eq .commonlabels.topic "database") -}}

Découvrez cet exemple testable :

func main() {
    t := template.must(template.new("").parse(src))

    m := map[string]any{
        "infoalert": "true",
        "topic":     "database",
    }
    if err := t.execute(os.stdout, m); err != nil {
        panic(err)
    }

    fmt.println("second round")
    m["infoalert"] = "false"
    if err := t.execute(os.stdout, m); err != nil {
        panic(err)
    }
}

const src = `
{{- if and (eq .infoalert "true") (eq .topic "database") -}}
    infoalert is true and topic is database
{{- end -}}
{{- if and (ne .infoalert "true") (eq .topic "database") -}}
    infoalert is not true and topic is database
{{ end }}
`

Cela affichera (essayez-le sur go terrain de jeu) :

infoalert is true and topic is database
Second round
infoalert is NOT true and topic is database

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer