<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GO | www.valeriofinazzo.it</title>
	<atom:link href="http://www.valeriofinazzo.it/wordpress/tag/go/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.valeriofinazzo.it/wordpress</link>
	<description>Il sito dell&#039;ingegnere Valerio Finazzo</description>
	<lastBuildDate>Fri, 30 Oct 2020 16:42:08 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.3</generator>
	<item>
		<title>TUTORIAL GO &#8211; LETTURA E SCRITTURA DEI FILE</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-lettura-e-scrittura-dei-file/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sat, 29 Aug 2020 08:29:36 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[GO]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=628</guid>

					<description><![CDATA[<p>Dopo aver visto le caratteristiche di Go cominciamo a vedere alcuni casi d&#8217;uso tipici dello sviluppo. Iniziamo con la lettura e la scrittura dei file. Come si può vedere ho introdotto nuovi package: os, io/ioutil e bufio. os è il package che offre i metodi per la creazione e cancellazione dei file, ioutil offre funzioni &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-lettura-e-scrittura-dei-file/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GO &#8211; LETTURA E SCRITTURA DEI FILE</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-lettura-e-scrittura-dei-file/">TUTORIAL GO – LETTURA E SCRITTURA DEI FILE</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Dopo aver visto le caratteristiche di Go cominciamo a vedere alcuni casi d&#8217;uso tipici dello sviluppo.  Iniziamo con la lettura e la scrittura dei file.</p>



<pre class="crayon-plain-tag">package main

import (
	&quot;bufio&quot;
	&quot;fmt&quot;
	&quot;io/ioutil&quot;
	&quot;os&quot;
)

func main() {

	nuovofile, errore := os.Create(&quot;miofile.txt&quot;)
	if errore == nil {
		fmt.Println(&quot;File creato: &quot;, nuovofile.Name())
	} else {
		fmt.Println(&quot;Errore: &quot;, errore)
		panic(errore)
	}
	nuovofile.WriteString(&quot;ciao a tutti&quot;)

	myWriter := bufio.NewWriter(nuovofile)
	myWriter.WriteString(&quot;\nciao a tutti&quot;)
	myWriter.Flush()
	nuovofile.Close()
	fmt.Println(&quot;File popolato&quot;)

	nuovofile, errore = os.Open(&quot;miofile.txt&quot;)
	if errore == nil {
		myslice := make([]byte, 100)
		n1, _ := nuovofile.Read(myslice)
		fmt.Println(&quot;char letti&quot;, n1)
		nuovofile.Seek(10, 0)
		n1, _ = nuovofile.Read(myslice)
		fmt.Println(&quot;char letti&quot;, n1)
	} else {
		panic(errore)
	}

	nuovofile.Seek(0, 0)
	myReader := bufio.NewReader(nuovofile)
	lettura, _, errore := myReader.ReadLine()
	if errore == nil {
		fmt.Println(string(lettura))
	} else {
		fmt.Println(errore)
	}
	nuovofile.Close()

	txt, errore := ioutil.ReadFile(nuovofile.Name())
	if errore == nil {
		fmt.Println(&quot;File letto: &quot;, nuovofile.Name(), &quot;-&gt;&quot;, string(txt))
	}

	errore = os.Remove(nuovofile.Name())
	if errore == nil {
		fmt.Println(&quot;File rimosso: &quot;, nuovofile.Name())
	} else {
		fmt.Println(&quot;Errore: &quot;, errore)
	}

}</pre>



<p>Come si può vedere ho introdotto nuovi package: os, io/ioutil e bufio. os è il package che offre  i metodi per la creazione e cancellazione dei file, ioutil offre  funzioni per la manipolazione del file e bufio offre metodi bufferizzati per la lettura e scrittura</p>



<p>Nell&#8217;esempio in sequenza creo il file, lo popolo, ne leggo il contenuto e poi lo rimuovo dal file system.</p>



<p>nuovofile, errore := os.Create(&#8220;miofile.txt&#8221;) crea un file di nome miofile.txt nella directory dove eseguo il file .go. Il metodo Create restituisce 2 variabili, la prima di tipo file e la seconda di tipo Error che sarà valorizzato con il messaggio di errore se l&#8217;operazione non è possibile. Successivamente per popolare il file uso il metodo writestring della classe File e aggiungo ulteriore testo utilizzando un Writer offerto dal package bufio. Il writer bufferizzato migliora le prestazioni in caso di molte operazioni di scrittura e le rende effettive con il metodo flush, Infine con il close rendo il file disponibile per altre manipolazioni.</p>



<p>nuovofile, errore = os.Open(&#8220;miofile.txt&#8221;) apre il file con il nome passato come parametro e lo cerca nella directory dove il file go viene lanciato. Restituisce un oggetto di tipo file e l&#8217;eventuale errore.  La lettura del contenuto può essere fatta in vari modi. La funzione Read legge il contenuto e lo salva in uno slice, restituendo in uscita il numero di caratteri letti. La funzione Seek consente di spostare il punto di inizio di lettura del file. Anche per la lettura il bufio ci mette a disposizione il reader che consente di effettuare le letture  sfruttando il buffer in memoria.  Il package ioutil mette a disposizione delle funzioni che agevolano l&#8217;operazione di lettura, es. txt, errore := ioutil.ReadFile(nuovofile.Name()), restituisce il contenuto del file in una variabile di tipo []byte.</p>



<p>Infine per cancellare il file il package io mette a disposizione la funzione Remove che riceve in ingresso il nome del file.</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-lettura-e-scrittura-dei-file%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20LETTURA%20E%20SCRITTURA%20DEI%20FILE" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-lettura-e-scrittura-dei-file%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20LETTURA%20E%20SCRITTURA%20DEI%20FILE" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-lettura-e-scrittura-dei-file%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20LETTURA%20E%20SCRITTURA%20DEI%20FILE" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-lettura-e-scrittura-dei-file%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20LETTURA%20E%20SCRITTURA%20DEI%20FILE" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-lettura-e-scrittura-dei-file%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20LETTURA%20E%20SCRITTURA%20DEI%20FILE" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-lettura-e-scrittura-dei-file%2F&#038;title=TUTORIAL%20GO%20%E2%80%93%20LETTURA%20E%20SCRITTURA%20DEI%20FILE" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-lettura-e-scrittura-dei-file/" data-a2a-title="TUTORIAL GO – LETTURA E SCRITTURA DEI FILE"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-lettura-e-scrittura-dei-file/">TUTORIAL GO – LETTURA E SCRITTURA DEI FILE</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUTORIAL GO &#8211; GESTIONE DEI TIMER E DEI TICK</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-gestione-dei-timer-e-dei-tick/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 20 Aug 2020 21:08:13 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[GO]]></category>
		<category><![CDATA[tick]]></category>
		<category><![CDATA[timer]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=626</guid>

					<description><![CDATA[<p>Go gestisce il tempo tramite gli oggetti timer e tick. Il timer rappresenta un evento che si verifica una sola volta e si manifesta tramite l&#8217;invio di un dato su un channel ad esso associato. Nell&#8217;esempio ho definito un timer che scatta dopo 2 secondi e una goroutine che allo scadere del timer darà evidenza &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-gestione-dei-timer-e-dei-tick/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GO &#8211; GESTIONE DEI TIMER E DEI TICK</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-gestione-dei-timer-e-dei-tick/">TUTORIAL GO – GESTIONE DEI TIMER E DEI TICK</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Go gestisce il tempo tramite gli oggetti timer e tick. Il timer rappresenta un evento che si verifica una sola volta e si manifesta tramite l&#8217;invio di un dato su un channel ad esso associato.</p>



<pre class="crayon-plain-tag">package main

import (
	&quot;fmt&quot;
	&quot;time&quot;
)

func main() {

	timer := time.NewTimer(time.Second * 2)

	go func() {
		&amp;lt;-timer.C
		fmt.Println(&quot;Passati 2 secondi&quot;)
	}()

	time.Sleep(time.Second * 5)
}</pre>



<p>Nell&#8217;esempio ho definito un timer che scatta dopo 2 secondi e una goroutine che allo scadere del timer darà evidenza a video del tempo trascorso. La goroutine aspetta il valore inviato sul channel, attributo dell&#8217;oggetto timer. Questo meccanismo ci permette di impostare agevolmente dei timeout nel nostro codice.  Tramite la funzione Stop del timer possiamo evitare la sua attivazione.</p>



<pre class="crayon-plain-tag">go func() {
		timer.Stop()
	}()</pre>



<p>Qualora si voglia effettuare delle operazioni ad intervalli regolari Go mette a disposizione l&#8217;oggetto Ticker</p>



<pre class="crayon-plain-tag">ticker := time.NewTicker(time.Second * 1)
	go func() {
		for t := range ticker.C {
			fmt.Println(&quot;Ticker&quot;, t.Second())
			if t.Second() == 10 {
				ticker.Stop()
			}
		}
	}()</pre>



<p>Nell&#8217;esempio  ho creato un oggetto che inserisce un messaggio nel channel a intervalli regolari di un secondo. Anche il ticker presente una funzione Stop che consente di interrompere l&#8217;esecuzione del ticker.</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestione-dei-timer-e-dei-tick%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEI%20TIMER%20E%20DEI%20TICK" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestione-dei-timer-e-dei-tick%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEI%20TIMER%20E%20DEI%20TICK" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestione-dei-timer-e-dei-tick%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEI%20TIMER%20E%20DEI%20TICK" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestione-dei-timer-e-dei-tick%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEI%20TIMER%20E%20DEI%20TICK" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestione-dei-timer-e-dei-tick%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEI%20TIMER%20E%20DEI%20TICK" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestione-dei-timer-e-dei-tick%2F&#038;title=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEI%20TIMER%20E%20DEI%20TICK" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-gestione-dei-timer-e-dei-tick/" data-a2a-title="TUTORIAL GO – GESTIONE DEI TIMER E DEI TICK"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-gestione-dei-timer-e-dei-tick/">TUTORIAL GO – GESTIONE DEI TIMER E DEI TICK</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUTORIAL GO &#8211; GESTIRE LA COMUNICAZIONE CON I CHANNEL</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-gestire-la-comunicazione-con-i-channel/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Wed, 19 Aug 2020 16:41:22 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[After]]></category>
		<category><![CDATA[GO]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=623</guid>

					<description><![CDATA[<p>Nell&#8217;articolo precedente abbiamo illustrato un primo meccanismo per notificare al ricevente la chiusura del channel, ovvero l&#8217;invio di una stringa dedicata che comunica la fine del flusso. Go mette a disposizione la funzione close con cui esplicitare che il canale è stato chiuso, la chiusura non è una operazione obbligatoria come nel caso dei file, &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-gestire-la-comunicazione-con-i-channel/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GO &#8211; GESTIRE LA COMUNICAZIONE CON I CHANNEL</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-gestire-la-comunicazione-con-i-channel/">TUTORIAL GO – GESTIRE LA COMUNICAZIONE CON I CHANNEL</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Nell&#8217;articolo precedente abbiamo illustrato un primo meccanismo per notificare al ricevente la chiusura del channel, ovvero l&#8217;invio di una stringa dedicata che comunica la fine del flusso. Go mette a disposizione la funzione close con cui esplicitare che il canale è stato chiuso, la chiusura non è una operazione obbligatoria come nel caso dei file, ma permette di notificare al ricevente in modo esplicito la chiusura dello stream di dati.</p>



<pre class="crayon-plain-tag">func workerCloser(channel chan string) {
	channel &amp;lt;- &quot;workerCloser&quot;
	close(channel)
}
main() {
	canale4 := make(chan string)
	go workerCloser(canale4)
	msg3, ok := &amp;lt;-canale4
	fmt.Println(msg3)
	msg3, ok = &amp;lt;-canale4
	if !ok {
		fmt.Println(&quot;Canale chiuso&quot;)
	}
}</pre>



<p>Nell&#8217;esempio ho realizzato una funzione che scrive un messaggio e successivamente chiude il canale. Per capire se il canale è stato chiuso o meno leggo il secondo parametro ok di tipo boolean che vale false qualora il canale sia stato chiuso esplicitamente.</p>



<p>Insieme al close go mette a disposizione range, che avevamo visto usato per scorrere gli slices e che applicato ai channel permette di leggere tutti i valori nel channel fino alla chiusura.</p>



<pre class="crayon-plain-tag">func contatore(channel chan int, max int) {
	for i := 0; i &amp;lt; max; i++ {
		channel &amp;lt;- i
	}
	close(channel)
}
main() {
	canale5 := make(chan int, 10)
	go contatore(canale5, 5)
	for valore := range canale5 {
		fmt.Println(valore)
	}
}</pre>



<p>Nell&#8217;esempio ho creato una funzione contatore che riceve un parametro in ingresso e tramite ciclo for invia i parametri sul channel. Terminato il ciclo chiude il channel con il comando close. Nel main tramite il range leggo i valori dal channel e il ciclo si interrompe da solo. Notate che in questo caso il valore restituito dal range non l&#8217;indice ma il valore stesso.</p>



<p>Go permette di gestire la lettura di più channel concorrenti utilizzando la stessa goroutine. Per fare ciò si avvale del comando select che consente la lettura dei valori da channel differenti. Come sintassi ricorda molto lo switch case.</p>



<pre class="crayon-plain-tag">go func() {
		canale6 &amp;lt;- &quot;1&quot;
		canale6 &amp;lt;- &quot;2&quot;
	}()

	go func() {
		canale7 &amp;lt;- &quot;3&quot;
		time.Sleep(time.Second * 3)
		canale7 &amp;lt;- &quot;4&quot;
	}()

	for i := 0; i &amp;lt; 4; i++ {
		select {
		case mess1 := &amp;lt;-canale6:
			fmt.Println(mess1)
		case mess2 := &amp;lt;-canale7:
			fmt.Println(mess2)
		default:
			fmt.Println(&quot;Niente&quot;)
		}
	}</pre>



<p>Nell&#8217;esempio ho creato 2 funzioni anonime che scrivono i messaggi su 2 channel separati, tramite il comando select inserito all&#8217;interno nel ciclo for recupero tutti i valori inviati. Nel caso di messaggi concorrenti la select sceglie casualmente quale processare per primo. Con lo statement default possiamo implementare della logica da eseguire qualora non sia presente alcun dato nei channel gestiti dal select. Senza default la select rimarrà in attesa di messaggi dal channel ad ogni iterazione.</p>



<p>Il costrutto select consente anche di implementare in modo agevole un meccanismo di timeout tramite la funzione After del package time.</p>



<pre class="crayon-plain-tag">for i := 0; i &amp;lt; 2; i++ {
		select {
		case mess1 := &amp;lt;-canale6:
			fmt.Println(mess1)
		case &amp;lt;-time.After(time.Second * 2):
			fmt.Println(&quot;timeout&quot;)
		}
	}</pre>



<p>La funzione After simula la ricezione di un messaggio nel channel, in tal modo implementiamo una attesa di 2 secondi sul channel canale, trascorso il quale viene gestita la condizione di timeout.</p>



<p>Infine qualora si voglia gestire l&#8217;accesso concorrente a risorse di più goroutines Go mette a disposizioni le funzioni Lock e Unlock del package sync. I 2 comandi ci assicurano che solo un thread per volta potrà eseguire il codice compreso tra i 2 statement</p>



<pre class="crayon-plain-tag">func (cont *contatoreStruct) somma(val int) {
	var mutex sync.Mutex
	mutex.Lock()
	cont.counter = cont.counter + val
	mutex.Unlock()
}</pre>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestire-la-comunicazione-con-i-channel%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIRE%20LA%20COMUNICAZIONE%20CON%20I%20CHANNEL" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestire-la-comunicazione-con-i-channel%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIRE%20LA%20COMUNICAZIONE%20CON%20I%20CHANNEL" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestire-la-comunicazione-con-i-channel%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIRE%20LA%20COMUNICAZIONE%20CON%20I%20CHANNEL" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestire-la-comunicazione-con-i-channel%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIRE%20LA%20COMUNICAZIONE%20CON%20I%20CHANNEL" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestire-la-comunicazione-con-i-channel%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIRE%20LA%20COMUNICAZIONE%20CON%20I%20CHANNEL" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestire-la-comunicazione-con-i-channel%2F&#038;title=TUTORIAL%20GO%20%E2%80%93%20GESTIRE%20LA%20COMUNICAZIONE%20CON%20I%20CHANNEL" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-gestire-la-comunicazione-con-i-channel/" data-a2a-title="TUTORIAL GO – GESTIRE LA COMUNICAZIONE CON I CHANNEL"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-gestire-la-comunicazione-con-i-channel/">TUTORIAL GO – GESTIRE LA COMUNICAZIONE CON I CHANNEL</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUTORIAL GO &#8211; GOROUTINES E CHANNEL</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-goroutines-e-channel/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Mon, 17 Aug 2020 16:18:00 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[channel]]></category>
		<category><![CDATA[GO]]></category>
		<category><![CDATA[goroutine]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=618</guid>

					<description><![CDATA[<p>Go supporta i thread per la gestione di processi asincroni e lo fa in un modo estremamente semplice. Go usa la parola chiave go per avviare una function in modalità asincrona. Nell&#8217;esempio ho definito la func hello che si limita a stampare a video il classico messaggio &#8220;ciao mondo&#8221; e per invocarne l&#8217;esecuzione chiamo la &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-goroutines-e-channel/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GO &#8211; GOROUTINES E CHANNEL</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-goroutines-e-channel/">TUTORIAL GO – GOROUTINES E CHANNEL</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Go supporta i thread per la gestione di processi asincroni e lo fa in un modo estremamente semplice. Go usa la parola chiave go per avviare una function in modalità asincrona.</p>



<pre class="crayon-plain-tag">package main

import (
	&quot;fmt&quot;
	&quot;time&quot;
)

func hello() {
	fmt.Println(&quot;ciao mondo&quot;)
}

func main() {

	hello()

	go hello()

	go func() {
		hello()
	}()

	time.Sleep(time.Second * 3)
}</pre>



<p>Nell&#8217;esempio ho definito la func hello che si limita a stampare a video il classico messaggio &#8220;ciao mondo&#8221; e per invocarne l&#8217;esecuzione chiamo la function anteponendo la parola chiave go, con cui avvio un thread dedicato per l&#8217;esecuzione. Notate che ho importato il package time con cui ho impostato un attesa di 5 secondi per vedere il messaggio stampato altrimenti il programma avrebbe finito la sua esecuzione e non avremmo visto niente a schermo. Con semplicità ho gestito in maniera asincrona una funzione che non lo era. La parola chiave go può essere applicata anche a funzioni anonime ottenendo lo stesso effetto.</p>



<p>Le goroutines comunicano tra di loro tramite i channel,canali di comunicazioni monodirezionali detti in informatica pipe. Per creare una pipe si usa la parola chiave make seguito dalla parola chiave chan e il tipo di dato gestito. L&#8217;invio o la ricezione del dato avviene tramite la parola chiave -&gt; e &lt;-</p>



<pre class="crayon-plain-tag">messaggi := make(chan string)
	go func() {
		time.Sleep(time.Second * 3)
		messaggi &amp;lt;- &quot;ciao&quot;
	}()
	msg := &amp;lt;-messaggi
	fmt.Println(msg)</pre>



<p>Nell&#8217;esempio ho creato un chanel che accetta stringhe e nella goroutine anonima ho inviato la stringa &#8220;ciao&#8221; tramite il comando channel &lt;-  con un ritardo di 3 secondi.  Con il comando &lt;- channel effettuo la lettura del dato e in questo caso non  è stato necessario gestire ritardi e sincronizzazione perchè l&#8217;esecuzione del codice si interrompe in attesa della lettura del flusso dal channel.</p>



<p>Go mette a disposizione i channel con buffer, ovvero channel che possono ricevere più di un valore in attesa che poi venga letti. La sintassi prevede la dimensione del buffer successivamente al tipo gestito.</p>



<pre class="crayon-plain-tag">messaggiBufferend := make(chan string, 2)
	messaggiBufferend &amp;lt;- &quot;Ciao&quot;
	messaggiBufferend &amp;lt;- &quot;Mondo&quot;</pre>



<p>Nell&#8217;esempio ho creato un channel con dimensione del buffer pari a 2 e su questo ho inviato 2 messaggi separati.</p>



<p>Grazie ai channel è possibile sincronizzare i processi visto che i channel bloccano l&#8217;esecuzione dei comandi stando in attesa di un valore.</p>



<pre class="crayon-plain-tag">func worker(channel chan string) {
	time.Sleep(time.Second * 3)
	channel &amp;lt;- &quot;fine&quot;
}
main () {
	canale := make(chan string)
	go worker(canale)
	msg2 := &amp;lt;-canale
	fmt.Println(msg2)
}</pre>



<p>Nell&#8217;esempio ho creato una funzione worker  che attende 3 secondi prima di comunicare la fine sul channel ricevuto come parametro. Nel main avvia la goroutine con il worker e resto in attesa dell&#8217;esito della elaborazione per chiudere l&#8217;esecuzione.</p>



<p>E&#8217; possibile stabilire in sede di passaggio di una channel ad una funzione la direzione del channel, ovvero specificare se è abilitata l&#8217;invio o la ricezione </p>



<pre class="crayon-plain-tag">func chiamante(channel chan&amp;lt;- string) {
	channel &amp;lt;- &quot;sono il ricevente&quot;
}

func ricevente(channel &amp;lt;-chan string) {
	fmt.Println(&amp;lt;-channel)
}
main () {
	can := make(chan string)
	go chiamante(can)
	go ricevente(can)
}</pre>



<p>Nell&#8217;esempio ho definito una funzione chiamante che accetta un channel su cui inviare solo dati, una finzione ricevente che accetta un channel che riceve solo dati e nel main ho lanciato le go routine associate.</p>



<p>Nel prossimo articolo vedremo altre funzioni collegate ai channel</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-goroutines-e-channel%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GOROUTINES%20E%20CHANNEL" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-goroutines-e-channel%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GOROUTINES%20E%20CHANNEL" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-goroutines-e-channel%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GOROUTINES%20E%20CHANNEL" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-goroutines-e-channel%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GOROUTINES%20E%20CHANNEL" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-goroutines-e-channel%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GOROUTINES%20E%20CHANNEL" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-goroutines-e-channel%2F&#038;title=TUTORIAL%20GO%20%E2%80%93%20GOROUTINES%20E%20CHANNEL" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-goroutines-e-channel/" data-a2a-title="TUTORIAL GO – GOROUTINES E CHANNEL"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-goroutines-e-channel/">TUTORIAL GO – GOROUTINES E CHANNEL</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUTORIAL GO &#8211; GESTIONE DEGLI ERRORI</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-gestione-degli-errori/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Wed, 12 Aug 2020 22:34:09 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[errors]]></category>
		<category><![CDATA[GO]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=616</guid>

					<description><![CDATA[<p>Go introduce l&#8217;errore a livello di funzione, ovvero in Go solo una funzione può generare un errore e la sua presenza deve essere dichiarata tramite la parola chiave error Nell&#8217;esempio ho creato 3 funzioni con 3 comportamenti distinti: la prima non può generare un errore, la seconda può generare un errore, la terza restituisce una &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-gestione-degli-errori/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GO &#8211; GESTIONE DEGLI ERRORI</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-gestione-degli-errori/">TUTORIAL GO – GESTIONE DEGLI ERRORI</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Go introduce l&#8217;errore a livello di funzione, ovvero in Go solo una funzione può generare un errore e la sua presenza deve essere dichiarata tramite la parola chiave error</p>



<pre class="crayon-plain-tag">package main

import (
	&quot;errors&quot;
	&quot;fmt&quot;
)

func noerrore(valore string) string {
	return valore
}

func possibileerrore(valore string) error {
	var error error
	if valore == &quot;prova&quot; {
		error = errors.New(&quot;Valore non ammesso&quot;)
	}
	return error
}

func valoreconpossibileerrore(valore string) (string, error) {
	var error error
	if valore == &quot;prova&quot; {
		error = errors.New(&quot;Valore non ammesso&quot;)
	}
	return valore, error
}

func main() {
	fmt.Println(noerrore(&quot;prova&quot;))
	fmt.Println(possibileerrore(&quot;prova&quot;))
	fmt.Println(valoreconpossibileerrore(&quot;prova&quot;))
}</pre>



<p>Nell&#8217;esempio ho creato 3 funzioni con 3 comportamenti distinti: la prima non può generare un errore, la seconda può generare un errore, la terza restituisce una stringa e può generare un errore. Per convenzione l&#8217;errore è l&#8217;ultimo tipo di valore restituito e in assenza di errore esso vale nil. Per generare l&#8217;errore ci viene in soccorso il package errors che mette a disposizione la funzione New che genera un errore contenente un testo.</p>



<p>Go ci permette di definire nuovi tipi di errori basati sul comando structs, la cosa fondamentale è che essi implementino l&#8217;interafaccia error che presenta il metodo Error da implementare</p>



<pre class="crayon-plain-tag">type myError struct {
	codice      int
	descrizione string
}

func (e *myError) Error() string {
	return fmt.Sprintf(&quot;%d - %s&quot;, e.codice, e.descrizione)
}

func possibileMyerrore(valore string) error {
	var error error
	if valore == &quot;prova&quot; {
		error = &amp;amp;myError{1, &quot;KO&quot;}
	}
	return error
}</pre>



<p>In questo caso ho definito un error custom che presenta i campi codice e descrizione. Ho implementato  la funzione Error() che sostanzialmente fa il toString dell&#8217;errore e implementato un metodo di esempio che lo utilizza</p>



<p>A questo punto il metodo restituisce una interfaccia error e pertanto non sono accessibili i campi della struct definita. Per ovviare a questa limite occorre sfruttare il meccanismo della type assertion che permette di forzare il tipo che si desidera (il meccanismo ricordo il casting di java) e il gioco è fatto.</p>



<pre class="crayon-plain-tag">var errore = possibileMyerrore(&quot;prova&quot;)
	var er = errore.(*myError)
	fmt.Println(er.codice)</pre>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestione-degli-errori%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEGLI%20ERRORI" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestione-degli-errori%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEGLI%20ERRORI" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestione-degli-errori%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEGLI%20ERRORI" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestione-degli-errori%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEGLI%20ERRORI" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestione-degli-errori%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEGLI%20ERRORI" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-gestione-degli-errori%2F&#038;title=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEGLI%20ERRORI" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-gestione-degli-errori/" data-a2a-title="TUTORIAL GO – GESTIONE DEGLI ERRORI"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-gestione-degli-errori/">TUTORIAL GO – GESTIONE DEGLI ERRORI</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUTORIAL GO &#8211; FUNCTIONS</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-functions/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Mon, 10 Aug 2020 15:10:39 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[funzione]]></category>
		<category><![CDATA[GO]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=609</guid>

					<description><![CDATA[<p>Per definire una funzione Go mette a disposizione la parola chiave func seguita dal nome della funzione, l&#8217;elenco dei tipi attesi e l&#8217;elenco dei tipi restituiti, questo perchè in Go le funzioni possono restituire più valori in modo sequenziale, Nel caso sopra ho definito la funzione duplica che riceve in ingresso una stringa e restituisce &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-functions/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GO &#8211; FUNCTIONS</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-functions/">TUTORIAL GO – FUNCTIONS</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Per definire una funzione Go mette a disposizione la parola chiave func seguita dal nome della funzione, l&#8217;elenco dei tipi attesi e l&#8217;elenco dei tipi restituiti, questo perchè in Go le funzioni possono restituire più valori in modo sequenziale,</p>



<pre class="crayon-plain-tag">func duplica(valore string) string {
	return valore + valore
}</pre>



<p>Nel caso sopra ho definito la funzione duplica che riceve in ingresso una stringa e restituisce la string concatenata con se stessa</p>



<p>E&#8217; possibile definire più parametri in ingresso e se i parametri sono dello stesso tipo Go permette di dichiarare il tipo una volta sola</p>



<pre class="crayon-plain-tag">func concatena(primo string, secondo string) string {
	return primo + secondo
}

func concatena2(primo, secondo string) string {
	return primo + secondo
}</pre>



<p>In questo caso la funzione concatena riceve 2 stringhe in ingresso e le concatena dando il valore in uscita. Essendo parametri dello stesso tipo è possibile dichiarare il tipo una volta sola.</p>



<p>Anche in uscita è possibile definire più parametri</p>



<pre class="crayon-plain-tag">func conta(primo, secondo string) (int, int) {
	var a = len(primo)
	var b = len(secondo)
	return a, b
}
func main() {
	fmt.Println(conta(&quot;primo&quot;, &quot;secondo&quot;))
	var _, b = conta(&quot;primo&quot;, &quot;secondo&quot;)
	fmt.Println(b)
}</pre>



<p>In questo la funzione restituisce la lunghezza delle 2 stringhe ricevute in ingresso. E&#8217; possibile anche ignorare una delle 2 variabili tramite la parola chiave _.</p>



<p>Go mette anche a disposizione un meccanismo per definire un numero infinito di parametri in ingresso tramite la parola chiave &#8230;</p>



<pre class="crayon-plain-tag">func conta2(parole ...string) {
	for _, parola := range parole {
		fmt.Print(fmt.Sprintf(&quot;%d &quot;, len(parola)))
	}
}</pre>



<p>In questo caso ho definito una lista di valori in ingresso e per ognuno di essi restituisco la lunghezza della parola</p>



<p>Go permette di ritornare la funzione come tipo di ritorno di una funzione e di assegnarla ad una funzione e di poterlo assegnare ad una variabile</p>



<pre class="crayon-plain-tag">func conta3() func(...string) {
	var counter int = 1
	return func(parole ...string) {
		fmt.Print(&quot;esecuzione &quot;, counter, &quot; &quot;)
		counter++
		for _, parola := range parole {
			fmt.Print(fmt.Sprintf(&quot;%d &quot;, len(parola)))
		}
		fmt.Println()
	}
}

func main() {
        contatore := conta3()
	contatore(&quot;primo&quot;, &quot;secondo&quot;, &quot;terzo&quot;)
	contatore(&quot;terzo&quot;, &quot;quarto&quot;, &quot;quinto&quot;)

	contatore2 := func(parole ...string) {
		for _, parola := range parole {
			fmt.Print(fmt.Sprintf(&quot;%d &quot;, len(parola)))
		}
		fmt.Println()
	}

	contatore2(&quot;primo&quot;, &quot;secondo&quot;, &quot;terzo&quot;)
	contatore2(&quot;terzo&quot;, &quot;quarto&quot;, &quot;quinto&quot;)
}</pre>



<p>Nell&#8217;esempio ho definito una funzione conta3 che riceve una lista di valori variabili in ingresso e che per ognuno di essi elabora la lunghezza e la stampa. Successivamente assegno la funzione ad una variabile e la eseguo invocando la variabile stessa con i parametri in ingresso. Posso ottenere un comportamento analogo definendo la function direttamente dopo il nome della variabile ma in questo caso perdo la gestione della variabile di stato counter.</p>



<p>Infine Go supporta la ricorsione ovvero una funzione che elabora il risultato richiamando se stesso e basando il tutto su una condizione di uscita. Classico esempio è la funzione fattoriale</p>



<pre class="crayon-plain-tag">func fattoriale(valore int) int {
	if valore == 0 {
		return 1
	} else {
		return valore * fattoriale(valore-1)
	}
}</pre>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-functions%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20FUNCTIONS" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-functions%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20FUNCTIONS" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-functions%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20FUNCTIONS" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-functions%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20FUNCTIONS" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-functions%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20FUNCTIONS" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-functions%2F&#038;title=TUTORIAL%20GO%20%E2%80%93%20FUNCTIONS" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-functions/" data-a2a-title="TUTORIAL GO – FUNCTIONS"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-functions/">TUTORIAL GO – FUNCTIONS</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUTORIAL GO &#8211; ARRAY, SLICES e MAP</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-array-slices-e-map/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sat, 08 Aug 2020 18:47:51 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[arrays]]></category>
		<category><![CDATA[GO]]></category>
		<category><![CDATA[map]]></category>
		<category><![CDATA[slices]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=606</guid>

					<description><![CDATA[<p>Cosa è un array ? E&#8217; una sequenze definita di valori dello stesso tipo e prevede fin dall&#8217;inizio di stabilire quanti elementi contenga. la sintassi per definire l&#8217;array prevede la parola var, il nome della variabile (in questo caso ar), numero di elementi in esso contenuti previsti compreso tra [] e il tipo degli elementi. &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-array-slices-e-map/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GO &#8211; ARRAY, SLICES e MAP</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-array-slices-e-map/">TUTORIAL GO – ARRAY, SLICES e MAP</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Cosa è un array ? E&#8217; una sequenze definita di valori dello stesso tipo e prevede fin dall&#8217;inizio di stabilire quanti elementi contenga.</p>



<pre class="crayon-plain-tag">package main

import &quot;fmt&quot;

func main() {
	var ar [5]int
	fmt.Println(ar)

	var br = [5]string{&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;}
	fmt.Println(br)

	br[0] = &quot;&quot;
	fmt.Println(br)

	var multi [3][3]string
	for i := 0; i &amp;lt; 3; i++ {
		multi[i][0] = &quot;0&quot;
		multi[i][1] = &quot;X&quot;
		multi[i][2] = &quot;0&quot;
	}
	fmt.Println(multi)

	fmt.Println(len(multi))
}</pre>



<p>la sintassi per definire l&#8217;array prevede la parola var, il nome della variabile (in questo caso ar), numero di elementi in esso contenuti previsti compreso tra [] e il tipo degli elementi. In assenza di inizializzazione si applicano le regole 0 per numeri, false per booleani, stringa vuota per Stringhe. Per l&#8217;inizializzazione si usano le parentesi {} con i valori previsti separati da ,.</p>



<p>Per accedere al singolo elemento si specifica l&#8217;indice tra [], considerando che l&#8217;indice parte da 0. </p>



<p>Per conoscere quanti elementi contiene l&#8217;array Go mette a disposizione il comando len.</p>



<p>E&#8217; possibile definire array multidimensionali specificando più volte le varie dimensioni sempre racchiuse tra [].</p>



<p>Il limite dell&#8217;array è che ha una dimensione fissa e non può essere esteso,  quindi va usato in caso dove la dimensione è nota a priori, negli altri casi Go mette a disposizione il tipo slices.</p>



<p>Devo dire che lo slices come concetto è carico, esso supera i limiti dell&#8217;array appoggiandosi sempre ad un array che Go gestisce internamente.</p>



<p>Per instanziare lo slice si usa il comanda make che riceve in ingresso 3 parametri: il tipo di elementi, la lunghezza iniziale dello slices e la sua capacità. La capacità è opzionale ed in usa assenza verrà inizializzata con il valore della lunghezza.</p>



<pre class="crayon-plain-tag">var sl = make([]int, 0, 3)
	fmt.Println(len(sl), cap(sl))
	for i := 0; i &amp;lt; 5; i++ {
		sl = append(sl, i)
		fmt.Println(len(sl), cap(sl))
	}</pre>



<p>Nell&#8217;esempio ho creato uno slice che non ha nessun elemento presente ma che prevede una capacità iniziale di 3 elementi, superati il quale Go estenderà in automatico.  Tramite il ciclo for aggiungo in coda un elemento che Go farà senza problemi appoggiandosi ad un array virtualmente infinito. Infatti lo slice rappresenta una sezione di un array  di sistema</p>



<p>Go permette anche di gestire lo slices a partire da un array definito dall&#8217;utente specificando gli indici separati da :, indici che possono essere opzionali e in loro assenza viene considerata l&#8217;intera sezione dell&#8217;array.</p>



<pre class="crayon-plain-tag">var slbr []string = br[2:4]
	fmt.Println(slbr)

	var slbr1 []string = br[:4]
	fmt.Println(slbr1)

	var slbr2 []string = br[0:]
	fmt.Println(slbr2)

	var slbr3 []string = br[:]
	fmt.Println(slbr3)

	var slb3copy = make([]string, len(slbr3))
	copy(slb3copy, slbr3)
	fmt.Println(slbr3, slb3copy)

	for i, v := range slb3copy {
		fmt.Printf(&quot;%d = %s\n&quot;, i, v)
	}
       
       for i := range slb3copy {
		fmt.Printf(&quot;%d = %s\n&quot;, i, &quot;&quot;)
	}

	for _, v := range slb3copy {
		fmt.Printf(&quot;%d = %s\n&quot;, 0, v)
	}</pre>



<p>Ogni modifica fatta sullo slice sarà visibile sull&#8217;array e viceversa, proprio perchè lo slice rappresenta una vista su quell&#8217;array. Tramite il comando copy sarà possibile copiare il contenuto dello slice verso un altro slice.</p>



<p>Per poter ciclare su uno slice ci viene in comando il comando range che restituisce 2 valori : indice e copia del valore contenuto nella cella. i valori possono essere omessi se non di interesse usando la chiave _.</p>



<p>Infine affrontiamo il concetto di map, che è una struttura che rappresenta il concetto di chiave/valore, e vediamo le operazioni che su di essa si possono effettuare,</p>



<pre class="crayon-plain-tag">var mp map[string]string = make(map[string]string)
	mp[&quot;chiave&quot;] = &quot;valore&quot;
	fmt.Println(mp)
	delete(mp, &quot;chiave&quot;)
	fmt.Println(mp)
	mp[&quot;chiave1&quot;] = &quot;valore1&quot;
	mp[&quot;chiave2&quot;] = &quot;valore2&quot;
	eleme, ok := mp[&quot;chiave2&quot;]
	fmt.Println(eleme, ok)
	eleme1, ok1 := mp[&quot;chiave3&quot;]
	fmt.Println(eleme1, ok1)
	for i, v := range mp {
		fmt.Println(i, v)
	}</pre>



<p>Definiamo la variabile mp come   mappa con la chiave di tipo string e il valore string. Per instanziare la variabile usiamo il comando make. Per inserire un record usiamo l&#8217;espressione nomevariabile[nomechiave]= valore. Dopo aver inserito il record possiamo eliminarlo tramite il comando delete  che in ingresso vuole la mappa e la chiave che definisce il record. Per leggere il valore si usa l&#8217;espressione nomevariabile[nomechiave] che restituisce 2 valori, il valore stesso e un boolean che indica se la chiave è stata trovata o meno. Nel caso in cui la chiave sia assente  viene restituita una stringa vuota. Anche in questo caso possiamo usare  la parola chiave range che ci restituisce per ogni record chiave e valore.</p>



<p>Alla prossima</p>



<p></p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-array-slices-e-map%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20ARRAY%2C%20SLICES%20e%20MAP" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-array-slices-e-map%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20ARRAY%2C%20SLICES%20e%20MAP" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-array-slices-e-map%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20ARRAY%2C%20SLICES%20e%20MAP" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-array-slices-e-map%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20ARRAY%2C%20SLICES%20e%20MAP" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-array-slices-e-map%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20ARRAY%2C%20SLICES%20e%20MAP" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-array-slices-e-map%2F&#038;title=TUTORIAL%20GO%20%E2%80%93%20ARRAY%2C%20SLICES%20e%20MAP" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-array-slices-e-map/" data-a2a-title="TUTORIAL GO – ARRAY, SLICES e MAP"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-array-slices-e-map/">TUTORIAL GO – ARRAY, SLICES e MAP</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUTORIAL GO &#8211; TIPI COMPLESSI STRUCTS E POINTER</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-tipi-complessi-structs-e-pointer/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Fri, 07 Aug 2020 14:59:39 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[GO]]></category>
		<category><![CDATA[pointer]]></category>
		<category><![CDATA[puntatori]]></category>
		<category><![CDATA[structs]]></category>
		<category><![CDATA[strutture]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=601</guid>

					<description><![CDATA[<p>Nell&#8217;articolo precedente abbiamo visto i tipi semplici messi a disposizione da GO, in questo vediamo come definire delle strutture dati più complesse. Go mette a disposizione il comando type che consente di definire delle strutture, ovvero collezioni di dati Tramite il comando type persona struct ho definito una struttura dati chiamata persona che presenta 2 &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-tipi-complessi-structs-e-pointer/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GO &#8211; TIPI COMPLESSI STRUCTS E POINTER</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-tipi-complessi-structs-e-pointer/">TUTORIAL GO – TIPI COMPLESSI STRUCTS E POINTER</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Nell&#8217;articolo precedente abbiamo visto i tipi semplici messi a disposizione da GO, in questo vediamo come definire delle strutture dati più complesse. Go mette a disposizione il comando type che consente di definire delle strutture, ovvero collezioni di dati</p>



<pre class="crayon-plain-tag">package main

import &quot;fmt&quot;

type persona struct {
	nome    string
	cognome string
}

func main() {

	var io persona
	io.cognome = &quot;finazzo&quot;
	io.nome = &quot;valerio&quot;
	fmt.Println(io)
	var sempreio = persona{&quot;valerio&quot;, &quot;finazzo&quot;}
	fmt.Println(sempreio)
	var ancoraio = persona{nome: &quot;valerio&quot;, cognome: &quot;finazzo&quot;}
	fmt.Println(ancoraio)
}</pre>



<p>Tramite il comando<em> type persona struct</em> ho definito una struttura dati chiamata persona che presenta 2 attributi nome e cognome di tipo string. Nel main ho instanziato la variabile persona e valorizzato gli attributi opportunamente usando il . per accedere alle sue varibili. Go permette di inizializzare direttamente l&#8217;oggetto tramite il nome stesso della struttura passando direttamente i valori, oppure specificando i valori con la coppia nome valore separati da :.</p>



<p>Go supporta i puntatori, ovvero il riferimento a zone di memoria per accedere al valore contenuto in esso. I comandi per gestire i puntatori sono * e &amp;.</p>



<pre class="crayon-plain-tag">var puntatoreame *persona = &amp;amp;io
	fmt.Println(puntatoreame.nome, puntatoreame.cognome)
	puntatoreame.cognome = &quot;finazzo2&quot;
	fmt.Println(puntatoreame.nome, puntatoreame.cognome)
	fmt.Println(io.nome, io.cognome)

	var nuovamenteio persona = io
	fmt.Println(nuovamenteio)
	nuovamenteio.cognome = &quot;finazzo3&quot;
	fmt.Println(nuovamenteio.nome, nuovamenteio.cognome)
	fmt.Println(io.nome, io.cognome)</pre>



<p>Tramite * definisco un puntatore verso una struttura di tipo persona e tramite &amp; la inizializzo verso la zona di memoria occupata dalla struttura io. A questo punto agisco su uno degli attributi di puntatoreame e vedrò le modifiche attive anche su io.</p>



<p>Il blocco successivo che non usa i puntatori crea una nuova variabile che ha gli stessi valori ma le modifiche che faccio successivamente non si ripercuotono sulla istanza io.</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-tipi-complessi-structs-e-pointer%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20TIPI%20COMPLESSI%20STRUCTS%20E%20POINTER" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-tipi-complessi-structs-e-pointer%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20TIPI%20COMPLESSI%20STRUCTS%20E%20POINTER" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-tipi-complessi-structs-e-pointer%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20TIPI%20COMPLESSI%20STRUCTS%20E%20POINTER" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-tipi-complessi-structs-e-pointer%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20TIPI%20COMPLESSI%20STRUCTS%20E%20POINTER" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-tipi-complessi-structs-e-pointer%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20TIPI%20COMPLESSI%20STRUCTS%20E%20POINTER" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-tipi-complessi-structs-e-pointer%2F&#038;title=TUTORIAL%20GO%20%E2%80%93%20TIPI%20COMPLESSI%20STRUCTS%20E%20POINTER" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-tipi-complessi-structs-e-pointer/" data-a2a-title="TUTORIAL GO – TIPI COMPLESSI STRUCTS E POINTER"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-tipi-complessi-structs-e-pointer/">TUTORIAL GO – TIPI COMPLESSI STRUCTS E POINTER</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUTORIAL GO &#8211; COSTRUTTI DI CONTROLLO</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-costrutti-di-controllo/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 06 Aug 2020 15:22:15 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[defer]]></category>
		<category><![CDATA[for]]></category>
		<category><![CDATA[GO]]></category>
		<category><![CDATA[if/else]]></category>
		<category><![CDATA[switch]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=594</guid>

					<description><![CDATA[<p>Oggi vediamo i costrutti di controllo offerti da GO. I costrutti consentono di configurare il flusso delle operazione sequenziali in base all&#8217;algoritmo stabilito dall&#8217;autore. Si dividono in iterativi e di selezione. FOR il costrutto for è un costrutto iterativo e consente di iterare un comando n volte fino a che è valida la condizione di &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-costrutti-di-controllo/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GO &#8211; COSTRUTTI DI CONTROLLO</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-costrutti-di-controllo/">TUTORIAL GO – COSTRUTTI DI CONTROLLO</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Oggi vediamo i costrutti di controllo offerti da GO. I costrutti consentono di configurare il flusso delle operazione sequenziali in base all&#8217;algoritmo stabilito dall&#8217;autore. Si dividono in iterativi e di selezione.</p>



<ul><li>FOR</li></ul>



<p>il costrutto for è un costrutto iterativo e consente di iterare  un comando n volte fino a che è valida la condizione di controllo</p>



<pre class="crayon-plain-tag">package main
import &quot;fmt&quot;
const limite = 5
// Stampa - commento
func main() {
	for i := 0; i &amp;lt; limite; i++ {
		fmt.Println(i)
	}
}</pre>



<p>nel ciclo for ho inizializzato la variabile i con 0 (Non ho esplicitato il tipo perchè Go lo desume da solo), ho definivo la condizione per continuare l&#8217;iterazione (i deve essere minore della costante limite) e ho definito la regola di incremento ( in questo caso i cresce di una unità per ogni iterazione). Rispetto ad altri linguaggi come java non sono richieste parentesi per chiudere i comandi di inizializzazione del for, mentre sono obbligatorie le parentesi {} per racchiudere il blocco di operazioni da effettuare.</p>



<p>La condizione di inizializzazione e la condizione di incremento sono opzionali, pertanto posso scrivere il codice in questo, rendendo il codice equivalente ad un costrutto while.</p>



<pre class="crayon-plain-tag">j := 0
for j &amp;lt; limite {
	fmt.Println(j)
	j = j + 1
}</pre>



<p>Anche la condizione di uscita può essere omessa, ottenendo così un ciclo virtualmente infinito che può essere pilotato tramite il comando break che interrompe l&#8217;esecuzione.</p>



<pre class="crayon-plain-tag">z := 0
for {
	z = z + 1
	fmt.Println(z)
	if z == 5 {
		break
	}
}</pre>



<p>Insieme al comando break può essere usato il comando continue che permette di saltare l&#8217;iterazione corrente e andare alla prossima.</p>



<ul><li>IF</li></ul>



<p>Il costrutto IF è un costrutto di seleziona e consente di eseguire il codice contenuto nelle sue parentesi {} al verificare di una condizione booleana. Se guardate il codice precedente  quando il contatore vale 5 il sistema interrompe il ciclo con il comando break. </p>



<p>Tramite il comando else è possibile definire un blocco di operazioni alternativo ed inoltre è possibile all&#8217;interno del blocco if definire una assegnazione ad una variabile che sarà visibile solo nel blocco if. </p>



<pre class="crayon-plain-tag">z := 0
for {
	z = z + 1
	if d := z; d == 5 {
		fmt.Println(&quot;fine&quot;)
		break
	} else {
		fmt.Println(d)
	}
}</pre>



<p>Nel blocco ho introdotto una variabile d inizializzata con il valore di z e ho definito una condizione alternativa a quella di uscita, grazie alla quale stampo il valore corrente dell&#8217;indice.</p>



<ul><li>SWITCH</li></ul>



<p>Il costrutto switch è un costrutto di selezione e ci viene in aiuto quando dobbiamo gestire la verifica di n possibili valori. Invece di usare tanti if/else annidati lo switch case ci consente di gestire in modo elegante la casistisca descritta.</p>



<pre class="crayon-plain-tag">switch z {
case 1:
	fmt.Println(1)
case 2:
	fmt.Println(2)
case 3, 4:
	fmt.Println(&quot;3 o 4&quot;)
case 1 * 5:
	fmt.Println(&quot;5&quot;)
default:
	fmt.Println(&quot;default&quot;)
}</pre>



<p>Nel blocco sopra sto verificando il valore di z, gestendo le casistiche 1 e 2 con apposito output, per gli altri valori viene stampato il valore default. Quando la condizione viene riscontrata il sistema esegue il codice relativo, a differenza di altri linquaggi come JAVA non è necessario specificare la chiave break. Nella clausola case possono essere presenti più condizioni separate da virgola ed è possibile inserire l&#8217;output di una funzione, l&#8217;importante che il tipo sia dello stesso tipo delle altre clausole.</p>



<p>E&#8217; possibile anche omettere la condizione da verificare ottenendo un modo più elegante per scrivere degli if/else in cascata specificando la regola di ingresso a livello del blocco case. Lo stesso codice di sopra può essere riscritto come segue</p>



<pre class="crayon-plain-tag">switch {
case z == 1:
	fmt.Println(1)
case z == 2:
	fmt.Println(2)
case z == 3 || z == 4:
	fmt.Println(&quot;3 o 4&quot;)
case z == 1*5:
	fmt.Println(&quot;5&quot;)
default:
	fmt.Println(&quot;default&quot;)
}</pre>



<ul><li>DEFER</li></ul>



<p>Il costrutto DEFER è un comando interessante. Consente di eseguire un codice alla fine del programma. Agisce come una pila con una logica di tipo First In Last Out, pertanto il primo comando inserito sarà l&#8217;ultimo ad essere eseguito.</p>



<pre class="crayon-plain-tag">package main

import &quot;fmt&quot;

const limite = 5

func main() {

	defer fmt.Println(&quot;Fatto quello che c'era da fare&quot;)
	defer fmt.Println(&quot;Sto per scrivere il penultimo messaggio&quot;)

	for i := 0; i &amp;lt; limite; i++ {
		fmt.Println(i)
	}

	j := 0
	for j &amp;lt; limite {
		fmt.Println(j)
		j = j + 1
	}

	var z int = 0
	for {
		z = z + 1
		if d := z; d == 5 {
			fmt.Println(&quot;fine&quot;)
			break
		} else {
			fmt.Println(d)
		}
	}

	switch z {
	case 1:
		fmt.Println(1)
	case 2:
		fmt.Println(2)
	case 3, 4:
		fmt.Println(&quot;3 o 4&quot;)
	case 1 * 5:
		fmt.Println(&quot;5&quot;)
	default:
		fmt.Println(&quot;default&quot;)
	}

	switch {
	case z == 1:
		fmt.Println(1)
	case z == 2:
		fmt.Println(2)
	case z == 3 || z == 4:
		fmt.Println(&quot;3 o 4&quot;)
	case z == 1*5:
		fmt.Println(&quot;5&quot;)
	default:
		fmt.Println(&quot;default&quot;)
	}
}</pre>



<p>Ottenendo così l&#8217;output atteso</p>



<pre class="crayon-plain-tag">0
1
2
3
4
0
1
2
3
4
1
2
3
4
fine
5
5
Sto per scrivere il penultimo messaggio
Fatto quello che c'era da fare</pre>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-costrutti-di-controllo%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20COSTRUTTI%20DI%20CONTROLLO" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-costrutti-di-controllo%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20COSTRUTTI%20DI%20CONTROLLO" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-costrutti-di-controllo%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20COSTRUTTI%20DI%20CONTROLLO" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-costrutti-di-controllo%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20COSTRUTTI%20DI%20CONTROLLO" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-costrutti-di-controllo%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20COSTRUTTI%20DI%20CONTROLLO" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-costrutti-di-controllo%2F&#038;title=TUTORIAL%20GO%20%E2%80%93%20COSTRUTTI%20DI%20CONTROLLO" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-costrutti-di-controllo/" data-a2a-title="TUTORIAL GO – COSTRUTTI DI CONTROLLO"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-costrutti-di-controllo/">TUTORIAL GO – COSTRUTTI DI CONTROLLO</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUTORIAL GO &#8211; PACKAGE, TIPI, VARIABILI E COSTANTI</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-package-tipi-variabili-e-costanti/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Wed, 05 Aug 2020 15:16:14 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[GO]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=590</guid>

					<description><![CDATA[<p>Messo in piedi l&#8217;IDE incominciamo a vedere come è strutturato il sorgente. Go è organizzato in package, quindi il primo comando definito all&#8217;interno del nostro file contiene la definizione del package tramite la direttiva package Il package principale è main ed è quello da cui parte la nostra applicazione. Possiamo importare altri package per estendere &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-package-tipi-variabili-e-costanti/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GO &#8211; PACKAGE, TIPI, VARIABILI E COSTANTI</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-package-tipi-variabili-e-costanti/">TUTORIAL GO – PACKAGE, TIPI, VARIABILI E COSTANTI</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Messo in piedi l&#8217;IDE incominciamo a vedere come è strutturato il sorgente.  Go è organizzato in package, quindi il primo comando definito all&#8217;interno del nostro file contiene la definizione del package tramite la direttiva package</p>



<p>Il package principale è main ed è quello da cui parte la nostra applicazione. Possiamo importare altri package per estendere le funzionalità a nostra disposizione e lo facciamo tramite la direttiva import.  I package hanno la classica struttura ad albero, importante sapere che per invocare le funzioni all&#8217;interno del programma va usato l&#8217;ultimo nodo della definizione del package.</p>



<pre class="crayon-plain-tag">package main
import (
	&quot;fmt&quot;
	&quot;math/rand&quot;
)
func main() {
	fmt.Print(rand.Intn(100))
}</pre>



<p>Nel codice sopra ho definito il package main, ho fatto l&#8217;import di 2 package di sistema e nella function main ho provveduto a stampare il risultato della chiamata random. Come potete vedere per invocare  la funzione ho utilizzato l&#8217;ultima parte del nome del package rand.</p>



<p>L&#8217;elenco completo dei package di sistema è disponibile <a href="https://golang.org/pkg/" target="_blank" rel="noreferrer noopener">qui</a>. L&#8217;import multiplo può essere fatto anche invocando più volte la direttiva   import per ogni package ma così risulta più compatto.</p>



<p>A questo punto introduciamo le variabili, esse possono essere definite a livello di package o a livello di funzione, possono essere definite in modo esplicito tramite la chiave var e relativo tipo oppure lasciamo che sia Go a dedurre il tipo.</p>



<pre class="crayon-plain-tag">package main

import (
	&quot;fmt&quot;
	&quot;math/rand&quot;
)

var principale int = 10
var i, j, k int = 1, 3, 4
var numberFloat float64

func main() {
	fmt.Println(rand.Intn(100))
	secondaria := true
	fmt.Println(principale)
	fmt.Println(secondaria)
	fmt.Println(i + j + k)
	fmt.Println(numberFloat)
	numberFloat = float64(principale)
	fmt.Println(numberFloat)
}</pre>



<p>Nel blocco ho definito una variabile principale a livello di package tramite var e specificando il tipo, mentre ho definito una variabile secondaria a livello di function specificando direttamente il valore e lasciando decidere al compilatore la deduzione del tipo. L&#8217;operatore := può essere usato solo dentro una function.</p>



<p>Go mira alla stesura di codice compatto e permette la definizione di più variabili e relativa inizializzazione nello stesso statement.</p>



<p>I tipi semplici previsti da Go sono i sequenti:</p>



<pre class="crayon-plain-tag">bool
string
int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr
byte // alias per il tipo uint8
rune // alias per il tipo int32
float32 float64
complex64 complex128</pre>



<p>Quando si definisce una variabile e non si specifica il valore il sistema inizializza con 0 i numeri, false i tipo bool e stringa vuota i tipi string. La conversione tra i tipi non è implicita ma deve essere gestita tramite l&#8217;opprtuna funzione.</p>



<p>Tramite l&#8217;operatore const è possibile definire delle costanti, se definite con lettera maiuscola saranno visibili al di fuori del package e dovranno presentare un commento a corredo</p>



<pre class="crayon-plain-tag">// Costante - esempio
const Costante = 10</pre>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-package-tipi-variabili-e-costanti%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20PACKAGE%2C%20TIPI%2C%20VARIABILI%20E%20COSTANTI" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-package-tipi-variabili-e-costanti%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20PACKAGE%2C%20TIPI%2C%20VARIABILI%20E%20COSTANTI" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-package-tipi-variabili-e-costanti%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20PACKAGE%2C%20TIPI%2C%20VARIABILI%20E%20COSTANTI" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-package-tipi-variabili-e-costanti%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20PACKAGE%2C%20TIPI%2C%20VARIABILI%20E%20COSTANTI" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-package-tipi-variabili-e-costanti%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20PACKAGE%2C%20TIPI%2C%20VARIABILI%20E%20COSTANTI" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F08%2Ftutorial-go-package-tipi-variabili-e-costanti%2F&#038;title=TUTORIAL%20GO%20%E2%80%93%20PACKAGE%2C%20TIPI%2C%20VARIABILI%20E%20COSTANTI" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-package-tipi-variabili-e-costanti/" data-a2a-title="TUTORIAL GO – PACKAGE, TIPI, VARIABILI E COSTANTI"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/08/tutorial-go-package-tipi-variabili-e-costanti/">TUTORIAL GO – PACKAGE, TIPI, VARIABILI E COSTANTI</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
