{"id":609,"date":"2020-08-10T17:10:39","date_gmt":"2020-08-10T15:10:39","guid":{"rendered":"http:\/\/www.valeriofinazzo.it\/wordpress\/?p=609"},"modified":"2020-10-30T17:41:22","modified_gmt":"2020-10-30T16:41:22","slug":"tutorial-go-functions","status":"publish","type":"post","link":"http:\/\/www.valeriofinazzo.it\/wordpress\/2020\/08\/tutorial-go-functions\/","title":{"rendered":"TUTORIAL GO &#8211; FUNCTIONS"},"content":{"rendered":"\n<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\u00e8 in Go le funzioni possono restituire pi\u00f9 valori in modo sequenziale,<\/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=\"\">func duplica(valore string) string {\n\treturn valore + valore\n}<\/pre>\n\n\n\n<p>Nel caso sopra ho definito la funzione duplica che riceve in ingresso una stringa e restituisce la string concatenata con se stessa<\/p>\n\n\n\n<p>E&#8217; possibile definire pi\u00f9 parametri in ingresso e se i parametri sono dello stesso tipo Go permette di dichiarare il tipo una volta sola<\/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=\"\">func concatena(primo string, secondo string) string {\n\treturn primo + secondo\n}\n\nfunc concatena2(primo, secondo string) string {\n\treturn primo + secondo\n}<\/pre>\n\n\n\n<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 \u00e8 possibile dichiarare il tipo una volta sola.<\/p>\n\n\n\n<p>Anche in uscita \u00e8 possibile definire pi\u00f9 parametri<\/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=\"\">func conta(primo, secondo string) (int, int) {\n\tvar a = len(primo)\n\tvar b = len(secondo)\n\treturn a, b\n}\nfunc main() {\n\tfmt.Println(conta(\"primo\", \"secondo\"))\n\tvar _, b = conta(\"primo\", \"secondo\")\n\tfmt.Println(b)\n}<\/pre>\n\n\n\n<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>\n\n\n\n<p>Go mette anche a disposizione un meccanismo per definire un numero infinito di parametri in ingresso tramite la parola chiave &#8230;<\/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=\"\">func conta2(parole ...string) {\n\tfor _, parola := range parole {\n\t\tfmt.Print(fmt.Sprintf(\"%d \", len(parola)))\n\t}\n}<\/pre>\n\n\n\n<p>In questo caso ho definito una lista di valori in ingresso e per ognuno di essi restituisco la lunghezza della parola<\/p>\n\n\n\n<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>\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=\"\">func conta3() func(...string) {\n\tvar counter int = 1\n\treturn func(parole ...string) {\n\t\tfmt.Print(\"esecuzione \", counter, \" \")\n\t\tcounter++\n\t\tfor _, parola := range parole {\n\t\t\tfmt.Print(fmt.Sprintf(\"%d \", len(parola)))\n\t\t}\n\t\tfmt.Println()\n\t}\n}\n\nfunc main() {\n        contatore := conta3()\n\tcontatore(\"primo\", \"secondo\", \"terzo\")\n\tcontatore(\"terzo\", \"quarto\", \"quinto\")\n\n\tcontatore2 := func(parole ...string) {\n\t\tfor _, parola := range parole {\n\t\t\tfmt.Print(fmt.Sprintf(\"%d \", len(parola)))\n\t\t}\n\t\tfmt.Println()\n\t}\n\n\tcontatore2(\"primo\", \"secondo\", \"terzo\")\n\tcontatore2(\"terzo\", \"quarto\", \"quinto\")\n}<\/pre>\n\n\n\n<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>\n\n\n\n<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 \u00e8 la funzione fattoriale<\/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=\"\">func fattoriale(valore int) int {\n\tif valore == 0 {\n\t\treturn 1\n\t} else {\n\t\treturn valore * fattoriale(valore-1)\n\t}\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<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\u00e8 in Go le funzioni possono restituire pi\u00f9 valori in modo sequenziale, Nel caso sopra ho definito la funzione duplica che riceve in ingresso una stringa e restituisce &hellip; <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\">&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":[117,105],"_links":{"self":[{"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts\/609"}],"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=609"}],"version-history":[{"count":3,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts\/609\/revisions"}],"predecessor-version":[{"id":612,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts\/609\/revisions\/612"}],"wp:attachment":[{"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/media?parent=609"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/categories?post=609"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/tags?post=609"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}