<?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>GOLANG | www.valeriofinazzo.it</title>
	<atom:link href="http://www.valeriofinazzo.it/wordpress/category/documentazione/golang/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:41:04 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.11</generator>
	<item>
		<title>TUTORIAL GOLANG &#8211; LEGGERE ARCHIVI</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-leggere-archivi/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 25 Oct 2020 16:48:28 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[golang]]></category>
		<category><![CDATA[zip]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=645</guid>

					<description><![CDATA[<p>Dopo aver visto come creare dei file zip vediamo come poter effettuare la lettura e lo spacchettamento di un file zip. Ipotizziamo di avere un file zip sotto la directory download, vogliamo leggerlo e scompattarlo nella directory dove lanciamo la routine go. A questo punto creiamo una directory rdt con permessi di scrittura Infine scorriamo &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-leggere-archivi/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GOLANG &#8211; LEGGERE ARCHIVI</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-leggere-archivi/">TUTORIAL GOLANG – LEGGERE ARCHIVI</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Dopo aver visto come creare dei file zip vediamo come poter effettuare la lettura e lo spacchettamento di un file zip.</p>



<p>Ipotizziamo di avere un file zip sotto la directory download, vogliamo leggerlo e scompattarlo nella directory dove lanciamo la routine go.</p>



<pre class="crayon-plain-tag">reader, err := zip.OpenReader(&quot;C:\\Users\\Valerio\\Downloads\\rdt.zip&quot;)
	if err != nil {
		fmt.Println(&quot;Errore: &quot;, err)
	}</pre>



<p>A questo punto creiamo una directory rdt con permessi di scrittura</p>



<pre class="crayon-plain-tag">err = os.Mkdir(&quot;rdt&quot;, 0755)
	if err != nil {
		fmt.Println(&quot;Errore: &quot;, err)
	}</pre>



<p>Infine scorriamo l&#8217;elenco dei file presenti all&#8217;interno dello zip, li leggiamo e li copiamo all&#8217;interno della directory appena generata</p>



<pre class="crayon-plain-tag">fileszip := reader.File
	for _, fil := range fileszip {
		singlereader, _ := fil.Open()
		newpath := filepath.Join(&quot;rdt&quot;, fil.Name)
		newfile, _ := os.Create(newpath)
		io.Copy(bufio.NewWriter(newfile), singlereader)
	}</pre>



<p>In questo esempio di nuovo vediamo il pakage filepath che ci permette di costruire dei percorsi sul file system con la function Join che concatena i percorsi ricevuti.</p>



<p>Alla prossima</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F10%2Ftutorial-golang-leggere-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20LEGGERE%20ARCHIVI" 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%2F10%2Ftutorial-golang-leggere-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20LEGGERE%20ARCHIVI" 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%2F10%2Ftutorial-golang-leggere-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20LEGGERE%20ARCHIVI" 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%2F10%2Ftutorial-golang-leggere-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20LEGGERE%20ARCHIVI" 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%2F10%2Ftutorial-golang-leggere-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20LEGGERE%20ARCHIVI" 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%2F10%2Ftutorial-golang-leggere-archivi%2F&#038;title=TUTORIAL%20GOLANG%20%E2%80%93%20LEGGERE%20ARCHIVI" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-leggere-archivi/" data-a2a-title="TUTORIAL GOLANG – LEGGERE ARCHIVI"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-leggere-archivi/">TUTORIAL GOLANG – LEGGERE ARCHIVI</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUTORIAL GOLANG &#8211; GENERARE ARCHIVI</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-gestire-archivi/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 04 Oct 2020 15:59:53 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[golang]]></category>
		<category><![CDATA[tar]]></category>
		<category><![CDATA[zip]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=640</guid>

					<description><![CDATA[<p>Golang mette a disposizione i package tar e zip per gestire le operazioni comuni di creazione archivi e la loro compressione. Il package tar consente di raggruppare in un unico file tutti i file contenuti in una directory mentre il package zip consente di effettuare la compressione dei dati. Vediamo come creare un tar e &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-gestire-archivi/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GOLANG &#8211; GENERARE ARCHIVI</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-gestire-archivi/">TUTORIAL GOLANG – GENERARE ARCHIVI</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Golang mette a disposizione i package tar e zip per gestire le operazioni comuni di creazione archivi e la loro compressione. Il package tar consente di raggruppare in un unico file tutti i file contenuti in una directory mentre il package zip consente di effettuare la compressione dei dati.</p>



<p>Vediamo come creare un tar e un file zip. In particolare consideriamo una cartella e mettiamo il contenuto della cartella in un file tar e in un file zip</p>



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

import (
	&quot;archive/tar&quot;
	&quot;archive/zip&quot;
	&quot;fmt&quot;
	&quot;io/ioutil&quot;
	&quot;os&quot;
)

func main() {
	fmt.Println(&quot;Start&quot;)

	filetar, err := os.Create(&quot;../mytar.tar&quot;)
	filezip, err := os.Create(&quot;../mytar.zip&quot;)

	if err != nil {
		fmt.Println(&quot;Errore: &quot;, err)
	}
	writerTar := tar.NewWriter(filetar)
	writerZip := zip.NewWriter(filezip)

	defer writerTar.Close()
	defer writerZip.Close()

	files, err := ioutil.ReadDir(&quot;.&quot;)
	for _, singlefile := range files {
		if !singlefile.IsDir() {
			content, _ := ioutil.ReadFile(singlefile.Name())
			hdr := &amp;amp;tar.Header{
				Name: singlefile.Name(),
				Size: singlefile.Size(),
			}
			err = writerTar.WriteHeader(hdr)
			writerTar.Write(content)

			wr, _ := writerZip.Create(singlefile.Name())
			wr.Write(content)
		}
	}

	fmt.Println(&quot;End&quot;)
}</pre>



<p>Tramite la fucntion Create creo sia il file tar che il file zip e per ognuno di essi genero un writer. Tramite il comando defer mi assicuro che la chiusura del writer venga effettuato alla fine di tutti i miei comandi.</p>



<p>Tramite la funcion readDir recupero tutti i file della directory corrente, genero l&#8217;header per il tar che inizializzo con il nome e la size del file che sto provessando e finalmente posso scrivere tramite il writer sia l&#8217;header che il contenuto del file.</p>



<p>Per lo zip il giro è ancora più semplice perchè non è obbligatorio il passaggio dell&#8217;header.</p>



<p>Nel prossimo articolo vedremo come leggere e recuperare i dati dai miei archivi.</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F10%2Ftutorial-golang-gestire-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20GENERARE%20ARCHIVI" 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%2F10%2Ftutorial-golang-gestire-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20GENERARE%20ARCHIVI" 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%2F10%2Ftutorial-golang-gestire-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20GENERARE%20ARCHIVI" 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%2F10%2Ftutorial-golang-gestire-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20GENERARE%20ARCHIVI" 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%2F10%2Ftutorial-golang-gestire-archivi%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20GENERARE%20ARCHIVI" 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%2F10%2Ftutorial-golang-gestire-archivi%2F&#038;title=TUTORIAL%20GOLANG%20%E2%80%93%20GENERARE%20ARCHIVI" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-gestire-archivi/" data-a2a-title="TUTORIAL GOLANG – GENERARE ARCHIVI"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/10/tutorial-golang-gestire-archivi/">TUTORIAL GOLANG – GENERARE ARCHIVI</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUTORIAL GOLANG &#8211; ESEGUIRE CHIAMATE HTTP</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-golang-eseguire-chiamate-http/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 27 Sep 2020 19:49:13 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[certificato]]></category>
		<category><![CDATA[golang]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[proxy]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=638</guid>

					<description><![CDATA[<p>L&#8217;articolo illustra come fare delle chiamate http tramite go. Il package che offre le funzioni per gestire il protocollo http si chiama &#8220;net/http&#8221;. Vediamo subito come gestire i principali casi d&#8217;uso. Per effettuare una GET si usa la funzione get, che restituisce un oggetto Response e un oggetto Error. Nell&#8217;esempio sto invocando la homepage di &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-golang-eseguire-chiamate-http/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GOLANG &#8211; ESEGUIRE CHIAMATE HTTP</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-golang-eseguire-chiamate-http/">TUTORIAL GOLANG – ESEGUIRE CHIAMATE HTTP</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>L&#8217;articolo illustra come fare delle chiamate http tramite go. Il package che offre le funzioni per gestire il protocollo http si chiama &#8220;net/http&#8221;. Vediamo subito come gestire i principali casi d&#8217;uso. </p>



<p>Per effettuare una GET si usa la funzione get, che restituisce un oggetto Response e  un oggetto Error.</p>



<pre class="crayon-plain-tag">response, err := http.Get(&quot;http://www.google.it&quot;)
	if err != nil {
		panic(err)
	}
	defer response.Body.Close()
	fmt.Println(&quot;Response status:&quot;, response.Status)
	body, err := ioutil.ReadAll(response.Body)
	fmt.Println(&quot;Response body:&quot;, string(body))</pre>



<p>Nell&#8217;esempio sto invocando la homepage di google, e verifico la presenza di errore e il codice restituito dalla risposta. Successivamente tramite  il package ioutil recupero il body della response e lo stampo  a video.</p>



<p>Se invece volessi inviare una post Golang mette a disposizione  2 funzioni: post e postForm. </p>



<p>La funzione post riceve in ingresso l&#8217;url cui inviare la post, il content type del dato che sto inviando e un reader del package io</p>



<pre class="crayon-plain-tag">response, err = http.Post(&quot;http://www.google.it&quot;, &quot;image/jpeg&quot;, bytes.NewBufferString(&quot;prova&quot;))
	if err != nil {
		panic(err)
	}
	fmt.Println(&quot;Response status:&quot;, response.Status)</pre>



<p>La funzione postForm invece riceve in ingresso l&#8217;url cui inviare la post e il form dei dati chiave, valore</p>



<p>Le 3 funzioni consentono di inviare get e post, ma qualora volessi usare altri metodi come la put o la delete occorre usare il metodo addNewRequest per creare una request e usare il client http per inviare la richiesta.</p>



<pre class="crayon-plain-tag">request, err := http.NewRequest(http.MethodDelete, &quot;http://www.google.it&quot;, bytes.NewBufferString(&quot;prova&quot;))
	if err != nil {
		panic(err)
	}
	client := &amp;amp;http.Client{}
	response, err = client.Do(request)
	if err != nil {
		panic(err)
	}
	fmt.Println(&quot;Response status:&quot;, response.Status)</pre>



<p>Per gestire le caratteristiche avanzate delle connessioni Go mette a disposizione l&#8217;oggetto Transport che opportunamente configurato consente di definire un proxy per l&#8217;invocazione del servizio. Questo caso si presenta quando il nostro client è presente all&#8217;interno di una rete il cui accesso ad internet è veicolato dalla presenza di un proxy.</p>



<pre class="crayon-plain-tag">proxyUrl, err := url.Parse(&quot;http://user:password@127.0.0.1:3128&quot;)
	if err != nil {
		panic(err)
	}
	tr := &amp;amp;http.Transport{
		MaxIdleConns:       10,
		IdleConnTimeout:    30 * time.Second,
		DisableCompression: true,
		Proxy:              http.ProxyURL(proxyUrl),
	}
	client = &amp;amp;http.Client{Transport: tr}
	response, err = client.Do(request)
	if err != nil {
		panic(err)
	}
	fmt.Println(&quot;Response status:&quot;, response.Status)</pre>



<p>Qualora invece il nostro server voglia un certificato occorre caricare il certificato e configurato sempre nel transport affinchè venga usato in trasmissione</p>



<pre class="crayon-plain-tag">caCert, err := ioutil.ReadFile(&quot;miocertificato.crt&quot;)
	if err != nil {
		log.Fatal(err)
	}
	caCertPool := x509.NewCertPool()
	caCertPool.AppendCertsFromPEM(caCert)
	tr := &amp;amp;http.Transport{
		MaxIdleConns:       10,
		IdleConnTimeout:    30 * time.Second,
		DisableCompression: true,
		TLSClientConfig: &amp;amp;tls.Config{
			RootCAs: caCertPool,
		},
	}
	client = &amp;amp;http.Client{Transport: tr}</pre>



<p>Nell&#8217;esempio sto leggendo il certificato e lo sto configurando all&#8217;interno del transport per poi fornirlo al client.</p>



<p>Abbiamo quindi visto come invocare i vari metodi e come gestire una rete con proxy e una connessione crittografata con invio del certificato.</p>



<p>Alla prossima</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-golang-eseguire-chiamate-http%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20ESEGUIRE%20CHIAMATE%20HTTP" 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%2F09%2Ftutorial-golang-eseguire-chiamate-http%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20ESEGUIRE%20CHIAMATE%20HTTP" 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%2F09%2Ftutorial-golang-eseguire-chiamate-http%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20ESEGUIRE%20CHIAMATE%20HTTP" 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%2F09%2Ftutorial-golang-eseguire-chiamate-http%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20ESEGUIRE%20CHIAMATE%20HTTP" 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%2F09%2Ftutorial-golang-eseguire-chiamate-http%2F&amp;linkname=TUTORIAL%20GOLANG%20%E2%80%93%20ESEGUIRE%20CHIAMATE%20HTTP" 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%2F09%2Ftutorial-golang-eseguire-chiamate-http%2F&#038;title=TUTORIAL%20GOLANG%20%E2%80%93%20ESEGUIRE%20CHIAMATE%20HTTP" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-golang-eseguire-chiamate-http/" data-a2a-title="TUTORIAL GOLANG – ESEGUIRE CHIAMATE HTTP"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-golang-eseguire-chiamate-http/">TUTORIAL GOLANG – ESEGUIRE CHIAMATE HTTP</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUTORIAL GO &#8211; IMPLEMENTARE DEI SERVIZI HTTP</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-implementare-dei-servizi-http/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 13 Sep 2020 15:46:23 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[crud]]></category>
		<category><![CDATA[golang]]></category>
		<category><![CDATA[gorilla/mux]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=633</guid>

					<description><![CDATA[<p>Nell&#8217;articolo di oggi vedremo come instanziare un server ed esporre dei servizi per lettura e scrittura di una entità. Per fare questo utilizzeremo 2 nuovi package &#8220;net/http&#8221; e &#8220;encoding/json&#8221;, il primo ci permette di instanziare il server e definire le azioni da intraprendere per dei path, il secondo ci consente agevolvemente di fare encoding e &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-implementare-dei-servizi-http/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GO &#8211; IMPLEMENTARE DEI SERVIZI HTTP</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-implementare-dei-servizi-http/">TUTORIAL GO – IMPLEMENTARE DEI SERVIZI HTTP</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Nell&#8217;articolo di oggi vedremo come instanziare un server ed esporre dei servizi per lettura e scrittura di una entità. Per fare questo utilizzeremo 2 nuovi package &#8220;net/http&#8221; e &#8220;encoding/json&#8221;, il primo ci permette di instanziare il server e definire le azioni da intraprendere per dei path, il secondo ci consente agevolvemente di fare encoding e decoding di oggetti json.</p>



<p>Incominciamo instanziando il server e implementando un servizio di keepalive che serve a stabilire se il server è attivo regolarmente.</p>



<pre class="crayon-plain-tag">http.HandleFunc(&quot;/isAlive&quot;, isAlive)
	log.Fatal(http.ListenAndServe(&quot;:10000&quot;, nil))</pre>



<p>La funzione HandleFunc definisce il path e il relativo handler. Per handler si intende la funzione che verrà eseguita dal server in corrispondenza della richiesta riceveuta.</p>



<pre class="crayon-plain-tag">func isAlive(response http.ResponseWriter, request *http.Request) {
	fmt.Fprintf(response, &quot;alive&quot;)
}</pre>



<p>Se abbiamo fatto tutto bene invocando il servizio http://localhost:10000/isAlive riceveremo un 200 ok con testo alive.</p>



<p>A questo punto supponiamo di voler gestire una rubrica dei contatti e pertanto definiamo prima di tutto la nostra struct Contatto</p>



<pre class="crayon-plain-tag">type contatto struct {
	Nome    string `json:&quot;Nome&quot;`
	Cognome string `json:&quot;Cognome&quot;`
}</pre>



<p>La struct presenta 2 parametri Nome e Cognome e relative regole di trascodifica in json. Definiamo l&#8217;elenco dei contatti e lo inizializziamo con dei dati di prova, simulando la presenza di un database</p>



<pre class="crayon-plain-tag">var contatti []contatto
func main() {

	contatti = []contatto{
		contatto{Nome: &quot;nome 1&quot;, Cognome: &quot;Cognome 1&quot;},
		contatto{Nome: &quot;nome 2&quot;, Cognome: &quot;Cognome 2&quot;},
	}</pre>



<p>Infine definiamo l&#8217;handler relativo</p>



<pre class="crayon-plain-tag">func elencoContatti(response http.ResponseWriter, request *http.Request) {
	json.NewEncoder(response).Encode(contatti)
}

func main() {
        http.HandleFunc(&quot;/contatti&quot;, elencoContatti)
}</pre>



<p>In tal modo invocando l&#8217;url http://localhost:10000/contatti otterremo il seguente json [{&#8220;Nome&#8221;:&#8221;nome 1&#8243;,&#8221;Cognome&#8221;:&#8221;Cognome 1&#8243;},{&#8220;Nome&#8221;:&#8221;nome 2&#8243;,&#8221;Cognome&#8221;:&#8221;Cognome 2&#8243;}]</p>



<p>Di seguito il codice completo </p>



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

import (
	&quot;encoding/json&quot;
	&quot;fmt&quot;
	&quot;log&quot;
	&quot;net/http&quot;
)

type contatto struct {
	Nome    string `json:&quot;Nome&quot;`
	Cognome string `json:&quot;Cognome&quot;`
}

func isAlive(response http.ResponseWriter, request *http.Request) {
	fmt.Fprintf(response, &quot;alive&quot;)
}

func elencoContatti(response http.ResponseWriter, request *http.Request) {
	json.NewEncoder(response).Encode(contatti)
}

var contatti []contatto

func main() {

	contatti = []contatto{
		contatto{Nome: &quot;nome 1&quot;, Cognome: &quot;Cognome 1&quot;},
		contatto{Nome: &quot;nome 2&quot;, Cognome: &quot;Cognome 2&quot;},
	}

	fmt.Println(&quot;Http server up &quot;)
	http.HandleFunc(&quot;/isAlive&quot;, isAlive)
	http.HandleFunc(&quot;/contatti&quot;, elencoContatti)

	log.Fatal(http.ListenAndServe(&quot;:10000&quot;, nil))
}</pre>



<p>Il package http ci ha consentito di tirare su il server e configurare delle risposte su dei path statici. Il package ha dei limiti, non ci permette di configurare degli endpoint variabili ed esplicitare il metodo http supportato. Per superare questo limite ci viene in soccorso un nuovo package   &#8220;github.com/gorilla/mux&#8221;. Il package va installato con il comando </p>



<pre class="crayon-plain-tag">go get -u github.com/gorilla/mux</pre>



<p>A questo per tirare su il server e configurare opportunamente gli endpoint possiamo scrivere</p>



<pre class="crayon-plain-tag">myRouter := mux.NewRouter().StrictSlash(true)
	myRouter.HandleFunc(&quot;/isAlive&quot;, isAlive).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti&quot;, elencoContatti).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti/{id}&quot;, singoloContatto).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti&quot;, creaContatto).Methods(&quot;POST&quot;)
	myRouter.HandleFunc(&quot;/contatti/{id}&quot;, eliminaContatto).Methods(&quot;DELETE&quot;)
	log.Fatal(http.ListenAndServe(&quot;:10000&quot;, myRouter))</pre>



<p>Il packge ci mette a disposizione l&#8217;oggetto router che consente per ogni  handler di definire maggiori proprietà per meglio mappare il comportamento</p>



<pre class="crayon-plain-tag">func singoloContatto(response http.ResponseWriter, request *http.Request) {
	vars := mux.Vars(request)
	key := vars[&quot;id&quot;]
	for index, contatto := range contatti {
		fmt.Println(index, &quot; &quot;, key)
		i, _ := strconv.Atoi(key)
		if index == i {
			json.NewEncoder(response).Encode(contatto)
			return
		}
	}
	response.WriteHeader(http.StatusNotFound)
}</pre>



<p>Il package ci consente agevolmente di leggere le path variable e superare i limiti del package net/http.</p>



<p>Di seguito il codice completo per l&#8217;analisi dei metodi restanti</p>



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

import (
	&quot;encoding/json&quot;
	&quot;fmt&quot;
	&quot;log&quot;
	&quot;net/http&quot;
	&quot;strconv&quot;

	&quot;github.com/gorilla/mux&quot;
)

type contatto struct {
	Nome    string `json:&quot;Nome&quot;`
	Cognome string `json:&quot;Cognome&quot;`
}

func isAlive(response http.ResponseWriter, request *http.Request) {
	fmt.Fprintf(response, &quot;alive&quot;)
}

func elencoContatti(response http.ResponseWriter, request *http.Request) {
	json.NewEncoder(response).Encode(contatti)
}

func creaContatto(response http.ResponseWriter, request *http.Request) {
	var contatto contatto
	json.NewDecoder(request.Body).Decode(&amp;amp;contatto)
	contatti = append(contatti, contatto)
	json.NewEncoder(response).Encode(contatti)
}

func singoloContatto(response http.ResponseWriter, request *http.Request) {
	vars := mux.Vars(request)
	key := vars[&quot;id&quot;]
	for index, contatto := range contatti {
		fmt.Println(index, &quot; &quot;, key)
		i, _ := strconv.Atoi(key)
		if index == i {
			json.NewEncoder(response).Encode(contatto)
			return
		}
	}
	response.WriteHeader(http.StatusNotFound)
}

func eliminaContatto(response http.ResponseWriter, request *http.Request) {
	vars := mux.Vars(request)
	key := vars[&quot;id&quot;]
	for index := range contatti {
		fmt.Println(index, &quot; &quot;, key)
		i, _ := strconv.Atoi(key)
		if index == i {
			contatti = append(contatti[:index], contatti[index+1:]...)
			response.WriteHeader(http.StatusOK)
			return
		}
	}
	response.WriteHeader(http.StatusNotFound)
}

var contatti []contatto

func main() {

	contatti = []contatto{
		contatto{Nome: &quot;nome 1&quot;, Cognome: &quot;Cognome 1&quot;},
		contatto{Nome: &quot;nome 2&quot;, Cognome: &quot;Cognome 2&quot;},
	}

	fmt.Println(&quot;Http server up &quot;)
	//http.HandleFunc(&quot;/isAlive&quot;, isAlive)
	//http.HandleFunc(&quot;/contatti&quot;, elencoContatti)

	myRouter := mux.NewRouter().StrictSlash(true)
	myRouter.HandleFunc(&quot;/isAlive&quot;, isAlive).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti&quot;, elencoContatti).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti/{id}&quot;, singoloContatto).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti&quot;, creaContatto).Methods(&quot;POST&quot;)
	myRouter.HandleFunc(&quot;/contatti/{id}&quot;, eliminaContatto).Methods(&quot;DELETE&quot;)
	log.Fatal(http.ListenAndServe(&quot;:10000&quot;, myRouter))
}</pre>



<p>Alla prossima</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" 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%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" 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%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" 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%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" 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%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" 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%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&#038;title=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-implementare-dei-servizi-http/" data-a2a-title="TUTORIAL GO – IMPLEMENTARE DEI SERVIZI HTTP"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-implementare-dei-servizi-http/">TUTORIAL GO – IMPLEMENTARE DEI SERVIZI HTTP</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TUTORIAL GO &#8211; GESTIONE DEL DATABASE</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-gestione-del-database/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 06 Sep 2020 17:05:49 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[database.sql]]></category>
		<category><![CDATA[godror]]></category>
		<category><![CDATA[golang]]></category>
		<category><![CDATA[sqlx]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=630</guid>

					<description><![CDATA[<p>Nell&#8217;articolo di oggi vedremo come integrare un database oracle e come effettuare le operazione di lettua e scrittura. Prima di tutto introduciamo il package per la gestione del db database/sql e insieme al package dobbiamo importare il driver specifico per il database cui connettersi. L&#8217;elenco dei driver disponibili e le relative basi di dati supportati &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-gestione-del-database/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GO &#8211; GESTIONE DEL DATABASE</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-gestione-del-database/">TUTORIAL GO – GESTIONE DEL DATABASE</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Nell&#8217;articolo di oggi vedremo come integrare un database oracle e come effettuare le operazione di lettua e scrittura.</p>



<p>Prima di tutto introduciamo il package per la gestione del db database/sql e insieme al package dobbiamo importare il driver specifico per il database cui connettersi. L&#8217;elenco dei driver disponibili e le relative basi di dati supportati sono disponibili al link <a href="https://github.com/golang/go/wiki/SQLDrivers">https://github.com/golang/go/wiki/SQLDrivers</a>. Per lavoro uso Oracle, pertanto nell&#8217;esempio integro il driver godror. Per poter usare questo driver occorre installarlo e configurarlo nell&#8217;ambiente go tramite la direttiva:</p>



<pre class="crayon-plain-tag">go get github.com/godror/godror</pre>



<p>Il driver è realizzato in cgo pertanto è richiesta la presenza di un gcc compiler, nel mio caso ho utilizzato quello disponibile all&#8217;indirizzo <a href="https://jmeubank.github.io/tdm-gcc/">https://jmeubank.github.io/tdm-gcc/</a>. Maggiori informazioni su godror sono disponibili al l&#8217;url <a href="https://github.com/godror/godror">https://github.com/godror/godror</a></p>



<p>Dopo aver installato gcc e godror possiamo finalmente definire l&#8217;import</p>



<pre class="crayon-plain-tag">import (
	&quot;database/sql&quot;
	&quot;fmt&quot;
	_ &quot;github.com/godror/godror&quot;
)</pre>



<p>Per la connessione al db il comando da usare è Open del package db</p>



<pre class="crayon-plain-tag">db, err := sql.Open(&quot;godror&quot;, &quot;ldc/ldc@localhost:1521/xe&quot;)
	if err != nil {
		panic(err)
	}</pre>



<p>Il primo parametro della Open è il nome del driver e a seguire la stringa di connessione verso il db nel formato username@password@ip:port:sid</p>



<p>La funzione restituisce una istanza db e come secondo parametro un oggetto error che potrà essere gestito tramite la funzione panic.</p>



<p>Vediamo subito come effettuare una operazione di scrittura tramite la funzione Exec</p>



<pre class="crayon-plain-tag">tx, _ := db.Begin()
	rowsDeleted, err := db.Exec(&quot;delete from audit_obj where id=1&quot;)
	if err != nil {
		panic(err)
	}
	fmt.Println(&quot;rowsDeleted: &quot;, rowsDeleted)

	rowsInserted, err := db.Exec(&quot;insert into audit_obj (id, dataora, operazione) values(1, sysdate, 'insert')&quot;)
	if err != nil {
		panic(err)
	}
	fmt.Println(&quot;rowsInserted: &quot;, rowsInserted)
	tx.Commit()</pre>



<p>Nell&#8217;esempio tramite la funzione Begin ho avviato una transazione con commit previsto a fine operazioni di scrittura. Nel caso specifico sto facendo la cancellazione di un record dalla tabella di audit e successivo inserimento  La funzione Exec ritorna un oggetto Result che rappresenta l&#8217;esito di una qualsiasi chiamata al db mostrando quante righe sono state coinvolte e l&#8217;id dell&#8217;ultimo inserimento.</p>



<p>Se volessi leggere i dati mi viene in aiuto la funzione Query che restituisce un cursore che scorre sulle righe selezionate</p>



<pre class="crayon-plain-tag">rows, err := db.Query(&quot;select id, dataora, operazione  from audit_obj&quot;)
	if err != nil {
		panic(err)
	}
	defer rows.Close()

	var id int
	var dataora time.Time
	var operazione string
	for rows.Next() {
		rows.Scan(&amp;amp;id, &amp;amp;dataora, &amp;amp;operazione)
		fmt.Println(id, dataora, operazione)
	}
	db.Close()</pre>



<p>Nell&#8217;esempio sto leggenda dalla tabella audit tutti i record e tramite la funzione Scan dell&#8217;oggetto Rows la assegna a delle variabili per stamparne successivamente il valore. Con il comando defer chiudo il cursore alla fine di tutte le operazioni.</p>



<p>Per semplificare il lavoro con il db ci vengono in soccorso altri package che consentono di velocizzare il lavoro. Oggi introduco il package sqlx disponibile all&#8217;url <a href="https://jmoiron.github.io/sqlx/">https://jmoiron.github.io/sqlx/</a></p>



<p>Per installarlo il comando è</p>



<pre class="crayon-plain-tag">go get github.com/jmoiron/sqlx</pre>



<p>ad installazione effettuata può essere importato con la direttiva github.com/jmoiron/sqlx&#8221;. Questo package consente di mappare le query direttamente su struct senza dover ricorrere al comando Scan.</p>



<pre class="crayon-plain-tag">type Audit struct {
	ID      uint64    `db:&quot;ID&quot;`
	DATAORA time.Time `db:&quot;DATAORA&quot;`
}</pre>



<p>Ho definito una struct Audit che presenta i parametri ID e dataora, ne ho definito il tipo e tramite il thick ho definito il mapping, tramite la regola del contesto:nomecolonna.</p>



<p>A questo punto ottengo il gioco è fatto</p>



<pre class="crayon-plain-tag">dbx, err := sqlx.Open(&quot;godror&quot;, &quot;ldc/ldc@localhost:1521/xe&quot;)
	if err != nil {
		panic(err)
	}

	var audit Audit
	err = dbx.Get(&amp;amp;audit, &quot;select id, dataora from audit_obj where id = 1&quot;)
	if err != nil {
		panic(err)
	}
	fmt.Println(audit)

	audits := []Audit{}
	dbx.Select(&amp;amp;audits, &quot;select id, dataora  from audit_obj&quot;)
	if err != nil {
		panic(err)
	}
	fmt.Println(audits)</pre>



<p>Con la Open ottengo un riferimento al db che mi espone le funzioni Get per il recupero del singolo oggetto e Select per il recupero di un set di righe,</p>



<p>Alla prossima</p>



<p>ps. per i pigri a seguire l&#8217;intero codice</p>



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

import (
	&quot;database/sql&quot;
	&quot;fmt&quot;
	&quot;time&quot;

	_ &quot;github.com/godror/godror&quot;
	&quot;github.com/jmoiron/sqlx&quot;
)

type Audit struct {
	ID      uint64    `db:&quot;ID&quot;`
	DATAORA time.Time `db:&quot;DATAORA&quot;`
}

func main() {

	fmt.Println(&quot;Start&quot;)

	db, err := sql.Open(&quot;godror&quot;, &quot;ldc/ldc@localhost:1521/xe&quot;)
	if err != nil {
		panic(err)
	}

	tx, _ := db.Begin()
	result, err := db.Exec(&quot;delete from audit_obj where id=1&quot;)
	if err != nil {
		panic(err)
	}
	fmt.Println(&quot;rowsDeleted: &quot;, result)

	result, err = db.Exec(&quot;insert into audit_obj (id, dataora, operazione) values(1, sysdate, 'insert')&quot;)
	if err != nil {
		panic(err)
	}
	fmt.Println(&quot;rowsInserted: &quot;, result)
	tx.Commit()

	rows, err := db.Query(&quot;select id, dataora, operazione  from audit_obj&quot;)
	if err != nil {
		panic(err)
	}
	defer rows.Close()

	var id int
	var dataora time.Time
	var operazione string
	for rows.Next() {
		rows.Scan(&amp;amp;id, &amp;amp;dataora, &amp;amp;operazione)
		fmt.Println(id, dataora, operazione)
	}
	db.Close()

	dbx, err := sqlx.Open(&quot;godror&quot;, &quot;ldc/ldc@localhost:1521/xe&quot;)
	if err != nil {
		panic(err)
	}

	var audit Audit
	err = dbx.Get(&amp;amp;audit, &quot;select id, dataora from audit_obj where id = 1&quot;)
	if err != nil {
		panic(err)
	}
	fmt.Println(audit)

	audits := []Audit{}
	dbx.Select(&amp;amp;audits, &quot;select id, dataora  from audit_obj&quot;)
	if err != nil {
		panic(err)
	}
	fmt.Println(audits)

	dbx.Close()
	fmt.Println(&quot;End&quot;)

}</pre>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-gestione-del-database%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEL%20DATABASE" 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%2F09%2Ftutorial-go-gestione-del-database%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEL%20DATABASE" 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%2F09%2Ftutorial-go-gestione-del-database%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEL%20DATABASE" 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%2F09%2Ftutorial-go-gestione-del-database%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEL%20DATABASE" 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%2F09%2Ftutorial-go-gestione-del-database%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEL%20DATABASE" 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%2F09%2Ftutorial-go-gestione-del-database%2F&#038;title=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEL%20DATABASE" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-gestione-del-database/" data-a2a-title="TUTORIAL GO – GESTIONE DEL DATABASE"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-gestione-del-database/">TUTORIAL GO – GESTIONE DEL DATABASE</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
		<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>
	</channel>
</rss>
