{"id":616,"date":"2020-08-13T00:34:09","date_gmt":"2020-08-12T22:34:09","guid":{"rendered":"http:\/\/www.valeriofinazzo.it\/wordpress\/?p=616"},"modified":"2020-10-30T17:41:04","modified_gmt":"2020-10-30T16:41:04","slug":"tutorial-go-gestione-degli-errori","status":"publish","type":"post","link":"http:\/\/www.valeriofinazzo.it\/wordpress\/2020\/08\/tutorial-go-gestione-degli-errori\/","title":{"rendered":"TUTORIAL GO &#8211; GESTIONE DEGLI ERRORI"},"content":{"rendered":"\n<p>Go introduce l&#8217;errore a livello di funzione, ovvero in Go solo una funzione pu\u00f2 generare un errore e la sua presenza deve essere dichiarata tramite la parola chiave error<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package main\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\nfunc noerrore(valore string) string {\n\treturn valore\n}\n\nfunc possibileerrore(valore string) error {\n\tvar error error\n\tif valore == \"prova\" {\n\t\terror = errors.New(\"Valore non ammesso\")\n\t}\n\treturn error\n}\n\nfunc valoreconpossibileerrore(valore string) (string, error) {\n\tvar error error\n\tif valore == \"prova\" {\n\t\terror = errors.New(\"Valore non ammesso\")\n\t}\n\treturn valore, error\n}\n\nfunc main() {\n\tfmt.Println(noerrore(\"prova\"))\n\tfmt.Println(possibileerrore(\"prova\"))\n\tfmt.Println(valoreconpossibileerrore(\"prova\"))\n}<\/pre>\n\n\n\n<p>Nell&#8217;esempio ho creato 3 funzioni con 3 comportamenti distinti: la prima non pu\u00f2 generare un errore, la seconda pu\u00f2 generare un errore, la terza restituisce una stringa e pu\u00f2 generare un errore. Per convenzione l&#8217;errore \u00e8 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>\n\n\n\n<p>Go ci permette di definire nuovi tipi di errori basati sul comando structs, la cosa fondamentale \u00e8 che essi implementino l&#8217;interafaccia error che presenta il metodo Error da implementare<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">type myError struct {\n\tcodice      int\n\tdescrizione string\n}\n\nfunc (e *myError) Error() string {\n\treturn fmt.Sprintf(\"%d - %s\", e.codice, e.descrizione)\n}\n\nfunc possibileMyerrore(valore string) error {\n\tvar error error\n\tif valore == \"prova\" {\n\t\terror = &amp;myError{1, \"KO\"}\n\t}\n\treturn error\n}<\/pre>\n\n\n\n<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>\n\n\n\n<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 \u00e8 fatto.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\tvar errore = possibileMyerrore(\"prova\")\n\tvar er = errore.(*myError)\n\tfmt.Println(er.codice)<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Go introduce l&#8217;errore a livello di funzione, ovvero in Go solo una funzione pu\u00f2 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\u00f2 generare un errore, la seconda pu\u00f2 generare un errore, la terza restituisce una &hellip; <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\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[148],"tags":[121,105],"_links":{"self":[{"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts\/616"}],"collection":[{"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/comments?post=616"}],"version-history":[{"count":1,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts\/616\/revisions"}],"predecessor-version":[{"id":617,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts\/616\/revisions\/617"}],"wp:attachment":[{"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/media?parent=616"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/categories?post=616"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/tags?post=616"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}