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

Aller au modèle si condition

王林
Libérer: 2024-02-06 11:24:13
avant
435 Les gens l'ont consulté

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 -}}
Copier après la connexion

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
Copier après la connexion


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") -}}
Copier après la connexion

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 }}
`
Copier après la connexion

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
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal