Tutti i valori in Scriggo hanno un tipo e si hanno diversi tipi di base.
Scriggo implementa tutti i tipi di dato del linguaggio Go. In questa documentazione però vengono documentati solo i tipi più comunemente usati in un template, ma non c'è nessuna limitazione ad usare qualsiasi altro tipo di Go.
Sono valori booleani i valori true
e false
. Una variabile booleana si dichiara in uno dei seguenti modi:
{% var a bool %} a è false
{% var b = false %} b è false
{% var c = true %} c è true
Le stringhe si scrivono con le doppie virgolette "ciao"
oppure con l'accento grave `ciao`
. Una variabile stringa si dichiara in uno dei seguenti modi:
{% var a string %} a è una stringa vuota
{% var b = "" %} b è una stringa vuota
{% var c = "ciao" %} c è la stringa "ciao"
Per leggere la lunghezza in byte di una stringa si usa la funzione len
, invece per leggere la lunghezza in "caratteri" si usa runeCount
.
Il nome della funzione runeCount
deriva da "rune" che è il termine con cui vengono chiamati in Go i "caratteri" di una stringa. Per maggiori informazioni è possibile leggere Strings, bytes, runes and characters in Go.
Scriggo ha molti tipi numerici, tra questi quello di uso più comune nei template è int
. A questi si aggiunge il tipo Decimal
che rappresenza numeri decimali a virgola fissa utili per fare calcoli monetari senza perdita di precisione.
I valori di tipo int
sono numeri interi (per essere precisi variano da -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807). Una variable int
si dichiara in uno dei seguenti modi:
{% var a int %} a è 0
{% var b = 0 %} b è 0
{% var c = 5 %} c è 5
I valori di tipo Decimal
sono numeri decimali a virgola fissa e per crearne uno si usa la funzione decimal. Una variable Decimal
si dichiara in uno dei seguenti modi:
{% var a Decimal %} a è il numero decimale 0.0
{% var b = Decimal{} %} b è il numero decimale 0.0
{% var c = decimal("12.95") %} c è il numero decimale 12.95
Uno slice è una sequenza numerata di elementi di un determinato tipo. Ad esempio []int{5, 2, 7, 9}
è uno slice di int
e []string{"hello", "ciao"}
è uno slice di stringhe. Uno slice può essere nil
che è diverso dallo slice vuoto. Una variable slice si dichiara in uno dei seguenti modi:
{% var a []int %} a è lo slice di int nil
{% var b []int = nil %} b è è lo slice di int nil
{% var c = []int{} %} c è lo slice di int vuoto
{% var d = []int{3, 0, 7, 2} %} d è lo slice di int con elementi 3, 0, 7 e 2
Per accedere ad un elemento di uno slice si usano le parentesi quadre [
e ]
con indice a partire da 0
. Ad esempio:
{% var s = []string{"a", "b", "c"} %}
{% s[1] = "e" %}
{{ s[0] }} {{ s[1] }} {{ s[2] }}
a e c
Per accedere all'ultimo elemento di uno slice s
si può scrivere s[len(s)-1]
.
Accedere ad uno slice nil
o ad un indice che non esiste è un errore.
Per iterare sugli elementi di uno slice si usa l'istruzione for
in una delle sue diverse forme. Ad esempio:
{% var saluti = []string{"Ciao", "Hello", "你好"} %}
{% for saluto in saluti %}
{{ saluto }}
{% end %}
Ciao Hello 你好
Per leggere la lunghezza di uno slice, ossia il numero di elementi che contiene, si usa la funzione len
:
{% var s = []int{"a", "b", "c"} %}
{{ len(s) }}
3
Lo slicing è una operazione che ritorna una porzione di uno slice. Per fare lo slicing si usano le parentesi quadre [
e ]
indicando l'indice iniziale e l'indice finale escluso separati da due punti :
.
{% var s = []string{"a", "b", "c", "d", "e"} %}
{{ s[1:3] }}
b c
{% for e in s[2:5] %}
{{ e }}
{% end %}
c d e
Lo slicing non copia gli elementi e pertanto lo slice risultante fa riferimento agli stessi elementi dello slice originario:
{% var s = []int{0, 1, 2, 3, 4, 5} %}
{% var p = s[0:3] %}
{% s[0] = 5 %}
{{ p }}
5 1 2
La lunghezza di uno slice non può cambiare, ma si può fare uno slicing per avere uno slice più corto e si può fare un append per avere uno slice più lungo. L'append si fa con la funzione append
:
{% var s = []int{0, 1} %}
{% s = append(s, 2, 3, 4, 5) %}
{{ s }}
0 1 2 3 4 5
append
ritorna sempre un nuovo slice ma a differenza dello slicing non bisogna fare affidamento che lo slice ritornato faccia riferimento agli stessi elementi dello slice originario in quanto potrebbe far riferimento ad una loro copia.