Caratteristiche del linguaggio
Di seguito evindenziamo le caratteristiche principale di questo linguaggio:
- linguaggio fortemente tipizzato
- garbage collection per una gestione migliore della memoria
- programmazione concorrente semplice
- uso dei package per le dipendenze
- i commenti come nel linguaggio C o JAVA
- poche parole chiave da ricordare
- uso dei cicli semplificato
Limitate Parole chiave
- break
- default
- func
- interface
- select
- case
- defer
- go
- map
- struct
- chan
- else
- goto
- package
- switch
- const
- fallthrough
- if
- range
- type
- continue
- for
- import
- return
- var
Comandi di Go da command line
go env
: Visualizza le variabili d’ambiente attualmente impostategodoc tool tour
: Fa fare un giro nella documentazione di golanggo help
: Visualizza l’help dei comandigo run
: Esecuzione del codice a runtime
Ci sono altri comandi ma verranno presi in considerazione man mano che eseguiamo dei progetti …
Costrutti condizionali e cicli
if ([condizione]) {
// operazioni
} else {
altra operazione
}
switch ([espressione]){
case [valore1]:
//azione1
case [valore2]:
//azione2
default:
//azione default
}
for [var]:=[iniziale]; [condizione]; [incremento]{
//azioni
}
//esempio:
for i:=1; i<10; i+=1{
//azione
}
//esempio:
j:=1
for j<10; {
//azione
j++
}
Scrivere una funzione
func [nome funzione]([param][tipo],...) [tipo ritorno]{
//operazioni
}
func sum( parametro1 int, parametro2 int) int {
// operazioni
}
Gestione dei package
Per creare una propria libreria per esempio creo un file mytools.go :
package mytools
func funzione1(){
}
func funzione2(){
}
...
...
func funzioneN(){
}
Adesso vado nel mio main.go :
package main
import {
"mytools"
"fmt"
}
func main(){
mytools.funzione1()
}
Più in generale possiamo dire che:
package main
import {
"path/to/mytools"
"fmt"
}
...
Nel comando import possiamo inserire il path assoluto per raggiungere il nostro package oppure se mettiamo solo il nome del pacchetto, Go cerca usando il path di default.
Nei vari progetti che poi seguiranno vedremo anche altre situazioni particolari.
Vediamo i tipi
- int: intero
- int8 : 8 bit => -128 a +128
- int16 : 16 bit => -32.768 a 32.767
- int32 : 32 bit => -2.147.483.648 a 2.147.483.647
- int64 : 64 bit => circa -9 X 10^18 a circa 9 X 10^18
- uint: interi senza segno a valore doppio rispetto ai precedenti perchè partono da 0
- uint8 : 0-256
- uint16: 0 a 65.535
- uint32: 4.294.967.295
- uint64: 18 X 10^18
- float32 e float64 : valori in virgola mobile
- boolean: true o false
- string
Strutture di memoria
- Array:
var matrix[10] string matrix[0] = "mela" matrix[1] = "pera" //oppure var matrix = [2]string{"mela","pera"}
- Slice: sono degli “array” dinamici
var matrix []int // uno slice è caratterizzato da lunghezza e capacità in questo caso entrambe nulle // lunghezza = 0 // capacità = 0 // Se invece definisco lo slice come segue: matrix = make([]int,8,3) // in questo caso lo slice è inizializzato con : // lunghezza = 8 // capacità = 3 // inserimento di valori dentro uno slice: matrix= append(matrix,5) // inserisce il valore 5 // per estrarre elementi o porzioni di elementi: matrix := []int{10,20,30,40} estratti := matrix[2:3] // slice[start:end]
- Map: sono come i dizionari di Python, Hash di Ruby e HashMap di Java
// map[tipo chiave]tipo-valore //esempio: anagrafica := make(map[string]string) // la chiave di tipo stringa // il valore di tipo string // esempio: status := make(map[int]string) // status chiave di interi // status valori di stringa anagrafica["nome"] = "Tim" anagrafica["cognome] = "Cook" status[0] = "open" status[1] = "close" status[2] = "cancel" // estrarre i valori: status_attuale := status[0]
-
Struct : le strutture sono come quelle che si trovano nel C
// definisco una struttura dati : type Persona struct { id int nome string cognome string age int } // usare la nuova struttura dati impiegato1 := Persona{1,"Mario","Rossi",43} // Per accedere alla struttura fmt.Println("Nome impiegato:" + impiegato1.nome) // altro modo di definire una struct impiegato2 = Persona{cognome:"Hermano",id:2,nome:"Felipe"} fmt.Println("Nome impiegato2:" + impiegato2.nome) // l'ordine di come si definiscono i campi non è importante per l'impiegato2