

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Usare il linguaggio di template di Go
<a name="v9-alerting-notifications-go-templating"></a>

****  
**Questo argomento della documentazione è progettato per le aree di lavoro Grafana che supportano la versione 9.x di Grafana.**  
Per le aree di lavoro Grafana che supportano la versione 10.x di Grafana, vedere. [Funzionamento nella versione 10 di Grafana](using-grafana-v10.md)  
Per le aree di lavoro Grafana che supportano la versione 8.x di Grafana, vedere. [Funzionamento in Grafana versione 8](using-grafana-v8.md)

[Scrivi modelli di notifica nel linguaggio di template di Go, text/template.](https://pkg.go.dev/text/template)

Questa sezione fornisce una panoramica del linguaggio di template di Go e dei modelli di scrittura in text/template.

## Dot
<a name="v9-go-dot"></a>

 text/template C'è un cursore speciale chiamato punto, ed è scritto come`.`. Puoi pensare a questo cursore come a una variabile il cui valore cambia a seconda del punto del modello in cui viene utilizzato. Ad esempio, all'inizio di un modello di notifica `.` si fa riferimento all'`ExtendedData`oggetto, che contiene una serie di campi tra cui `Alerts``Status`, `GroupLabels``CommonLabels`, `CommonAnnotations` e`ExternalURL`. Tuttavia, dot potrebbe fare riferimento a qualcos'altro quando viene utilizzato in un `range` elenco completo, all'interno di un `with` o quando si scrivono modelli di funzionalità da utilizzare in altri modelli. Puoi vedere esempi di ciò in[Crea modelli di notifica](v9-alerting-create-templates.md), e tutti i dati e le funzioni in[Riferimento modello](v9-alerting-template-reference.md).

## Tag di apertura e chiusura
<a name="v9-go-openclosetags"></a>

In text/template, i modelli iniziano `{{` e finiscono con `}}` indipendentemente dal fatto che il modello stampi una variabile o esegua strutture di controllo come le istruzioni if. Questo è diverso da altri linguaggi di template come Jinja, dove la stampa di una variabile utilizza `{{` e e le strutture di controllo utilizzano e`}}`. `{%` `%}`

## Print (Stampa)
<a name="v9-go-print"></a>

Per stampare il valore di qualcosa usa e. `{{` `}}` È possibile stampare il valore di un punto, un campo di punti, il risultato di una funzione e il valore di una [variabile](#v9-go-variables). Ad esempio, per stampare il `Alerts` campo a cui si riferisce il punto `ExtendedData` devi scrivere quanto segue:

```
{{ .Alerts }}
```

## Esegui iterazioni sugli avvisi
<a name="v9-go-iterate-alerts"></a>

Per stampare solo le etichette di ogni avviso, anziché tutte le informazioni sull'avviso, puoi utilizzare `range` a per iterare gli avvisi in: `ExtendedData`

```
{{ range .Alerts }}
{{ .Labels }}
{{ end }}
```

All'interno dell'intervallo il punto non si riferisce più a`ExtendedData`, ma a un. `Alert` È possibile utilizzare `{{ .Labels }}` per stampare le etichette di ogni avviso. Funziona perché `{{ range .Alerts }}` cambia il punto per fare riferimento all'avviso corrente nell'elenco degli avvisi. Quando l'intervallo è terminato, il punto viene ripristinato al valore che aveva prima dell'inizio dell'intervallo, che in questo esempio è`ExtendedData`:

```
{{ range .Alerts }}
{{ .Labels }}
{{ end }}
{{/* does not work, .Labels does not exist here */}}
{{ .Labels }}
{{/* works, cursor was reset */}}
{{ .Status }}
```

## Esegui iterazioni su annotazioni ed etichette
<a name="v9-go-iterate-labels"></a>

Scriviamo un modello per stampare le etichette di ogni avviso nel formato`The name of the label is $name, and the value is $value`, dove `$name` e `$value` contiene il nome e il valore di ogni etichetta.

Come nell'esempio precedente, utilizzate un intervallo per scorrere gli avvisi in `.Alerts` modo che il punto si riferisca all'avviso corrente nell'elenco degli avvisi, quindi utilizzate un secondo intervallo sulle etichette ordinate in modo che dot venga aggiornato una seconda volta per fare riferimento all'etichetta corrente. All'interno del secondo intervallo usa `.Name` e stampa `.Value` il nome e il valore di ogni etichetta:

```
{{ range .Alerts }}
{{ range .Labels.SortedPairs }}
The name of the label is {{ .Name }}, and the value is {{ .Value }}
{{ end }}
{{ range .Annotations.SortedPairs }}
The name of the annotation is {{ .Name }}, and the value is {{ .Value }}
{{ end }}
{{ end }}
```

## Dichiarazioni If
<a name="v9-go-if"></a>

È possibile utilizzare le istruzioni if nei modelli. Ad esempio, per stampare `There are no alerts` se non sono presenti avvisi, `.Alerts` è necessario scrivere quanto segue:

```
{{ if .Alerts }}
There are alerts
{{ else }}
There are no alerts
{{ end }}
```

## Con
<a name="v9-go-with"></a>

With è simile alle istruzioni if, tuttavia a differenza delle istruzioni if, `with` aggiorna dot per fare riferimento al valore di with:

```
{{ with .Alerts }}
There are {{ len . }} alert(s)
{{ else }}
There are no alerts
{{ end }}
```

## Variabili
<a name="v9-go-variables"></a>

Le variabili in text/template devono essere create all'interno del modello. Ad esempio, per creare una variabile chiamata `$variable` con il valore corrente di dot devi scrivere quanto segue:

```
{{ $variable := . }}
```

Puoi usare `$variable` all'interno di un intervallo o `with` e farà riferimento al valore di dot nel momento in cui la variabile è stata definita, non al valore corrente di dot.

Ad esempio, non puoi scrivere un modello da utilizzare `{{ .Labels }}` nel secondo intervallo perché qui il punto si riferisce all'etichetta corrente, non all'avviso corrente:

```
{{ range .Alerts }}
{{ range .Labels.SortedPairs }}
{{ .Name }} = {{ .Value }}
{{/* does not work because in the second range . is a label not an alert */}}
There are {{ len .Labels }}
{{ end }}
{{ end }}
```

Puoi risolvere questo problema definendo una variabile chiamata `$alert` nel primo intervallo e prima del secondo intervallo:

```
{{ range .Alerts }}
{{ $alert := . }}
{{ range .Labels.SortedPairs }}
{{ .Name }} = {{ .Value }}
{{/* works because $alert refers to the value of dot inside the first range */}}
There are {{ len $alert.Labels }}
{{ end }}
{{ end }}
```

## Intervallo con indice
<a name="v9-go-rangeindex"></a>

È possibile ottenere l'indice di ogni avviso all'interno di un intervallo definendo le variabili di indice e valore all'inizio dell'intervallo:

```
{{ $num_alerts := len .Alerts }}
{{ range $index, $alert := .Alerts }}
This is alert {{ $index }} out of {{ $num_alerts }}
{{ end }}
```

## Definire i modelli
<a name="v9-go-define"></a>

È possibile definire modelli che possono essere utilizzati all'interno di altri modelli, utilizzando `define` e il nome del modello tra virgolette doppie. Non è necessario definire modelli con lo stesso nome di altri modelli, inclusi modelli predefiniti come `__subject``__text_values_list`,`__text_alert_list`, `default.title` e`default.message`. Se è stato creato un modello con lo stesso nome di un modello predefinito o un modello in un altro modello di notifica, Grafana potrebbe utilizzare entrambi i modelli. Grafana non impedisce o mostra un messaggio di errore quando ci sono due o più modelli con lo stesso nome.

```
{{ define "print_labels" }}
{{ end }}
```

## Incorpora modelli
<a name="v9-go-embed"></a>

È possibile incorporare un modello definito all'interno del modello utilizzando `template` il nome del modello tra virgolette doppie e il cursore da passare al modello:

```
{{ template "print_labels" . }}
```

## Passa i dati ai modelli
<a name="v9-go-passdata"></a>

All'interno di un modello, il punto si riferisce al valore passato al modello.

Ad esempio, se a un modello viene passato un elenco di avvisi di attivazione, dot si riferisce a quell'elenco di avvisi di attivazione:

```
{{ template "print_alerts" .Alerts }}
```

Se al modello vengono passate le etichette ordinate per un avviso, dot si riferisce all'elenco di etichette ordinate:

```
{{ template "print_labels" .SortedLabels }}
```

Questo è utile quando si scrivono modelli riutilizzabili. Ad esempio, per stampare tutti gli avvisi potresti scrivere quanto segue:

```
{{ template "print_alerts" .Alerts }}
```

Quindi, per stampare solo gli avvisi di attivazione, puoi scrivere questo:

```
{{ template "print_alerts" .Alerts.Firing }}
```

Funziona perché entrambi `.Alerts` `.Alerts.Firing` sono elenchi di avvisi.

```
{{ define "print_alerts" }}
{{ range . }}
{{ template "print_labels" .SortedLabels }}
{{ end }}
{{ end }}
```

## Commenti
<a name="v9-go-comments"></a>

Puoi aggiungere commenti con `{{/*` e`*/}}`:

```
{{/* This is a comment */}}
```

Per evitare che i commenti aggiungano interruzioni di riga, usa:

```
{{- /* This is a comment with no leading or trailing line breaks */ -}}
```

## Indentazione
<a name="v9-go-indentation"></a>

Puoi usare l'indentazione, sia di tabulazioni che di spazi, e le interruzioni di riga, per rendere i modelli più leggibili:

```
{{ range .Alerts }}
  {{ range .Labels.SortedPairs }}
    {{ .Name }} = {{ .Value }}
  {{ end }}
{{ end }}
```

Tuttavia, l'indentazione nel modello sarà presente anche nel testo. Successivamente vedremo come rimuoverlo.

## Rimuovi spazi e interruzioni di riga
<a name="v9-go-removespace"></a>

In text/template uso `{{-` e `-}}` per rimuovere gli spazi iniziali e finali e le interruzioni di riga.

Ad esempio, quando si utilizzano indentazioni e interruzioni di riga per rendere un modello più leggibile:

```
{{ range .Alerts }}
  {{ range .Labels.SortedPairs }}
    {{ .Name }} = {{ .Value }}
  {{ end }}
{{ end }}
```

L'indentazione e le interruzioni di riga saranno presenti anche nel testo:

```
    alertname = "Test"

    grafana_folder = "Test alerts"
```

Puoi rimuovere i rientri e le interruzioni di riga dal testo cambiando la posizione `}}` `-}}` all'inizio di ogni intervallo:

```
{{ range .Alerts -}}
  {{ range .Labels.SortedPairs -}}
    {{ .Name }} = {{ .Value }}
  {{ end }}
{{ end }}
```

I rientri e le interruzioni di riga nel modello sono ora assenti dal testo:

```
alertname = "Test"
grafana_folder = "Test alerts"
```