Open2b versione 7.5

Tipi di dato

Tutti i valori in Scriggo hanno un tipo e si hanno diversi tipi di base.

Tipi di dato di Go

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.

Booleani

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

Stringa

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.

Rune

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.

Numerici

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.

int

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

Decimal

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

Slice

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

Accedere ad un elemento di uno slice

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.

Iterare sugli elementi di uno slice

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 你好

Lunghezza di uno slice

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

Slicing

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 :.

Esempi

{% 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

Appendere elementi ad uno slice

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.