{"id":606,"date":"2020-08-08T20:47:51","date_gmt":"2020-08-08T18:47:51","guid":{"rendered":"http:\/\/www.valeriofinazzo.it\/wordpress\/?p=606"},"modified":"2020-10-30T17:41:34","modified_gmt":"2020-10-30T16:41:34","slug":"tutorial-go-array-slices-e-map","status":"publish","type":"post","link":"http:\/\/www.valeriofinazzo.it\/wordpress\/2020\/08\/tutorial-go-array-slices-e-map\/","title":{"rendered":"TUTORIAL GO &#8211; ARRAY, SLICES e MAP"},"content":{"rendered":"\n<p>Cosa \u00e8 un array ? E&#8217; una sequenze definita di valori dello stesso tipo e prevede fin dall&#8217;inizio di stabilire quanti elementi contenga.<\/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 \"fmt\"\n\nfunc main() {\n\tvar ar [5]int\n\tfmt.Println(ar)\n\n\tvar br = [5]string{\"a\", \"b\", \"c\", \"d\", \"e\"}\n\tfmt.Println(br)\n\n\tbr[0] = \"\"\n\tfmt.Println(br)\n\n\tvar multi [3][3]string\n\tfor i := 0; i &lt; 3; i++ {\n\t\tmulti[i][0] = \"0\"\n\t\tmulti[i][1] = \"X\"\n\t\tmulti[i][2] = \"0\"\n\t}\n\tfmt.Println(multi)\n\n\tfmt.Println(len(multi))\n}<\/pre>\n\n\n\n<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>\n\n\n\n<p>Per accedere al singolo elemento si specifica l&#8217;indice tra [], considerando che l&#8217;indice parte da 0. <\/p>\n\n\n\n<p>Per conoscere quanti elementi contiene l&#8217;array Go mette a disposizione il comando len.<\/p>\n\n\n\n<p>E&#8217; possibile definire array multidimensionali specificando pi\u00f9 volte le varie dimensioni sempre racchiuse tra [].<\/p>\n\n\n\n<p>Il limite dell&#8217;array \u00e8 che ha una dimensione fissa e non pu\u00f2 essere esteso,  quindi va usato in caso dove la dimensione \u00e8 nota a priori, negli altri casi Go mette a disposizione il tipo slices.<\/p>\n\n\n\n<p>Devo dire che lo slices come concetto \u00e8 carico, esso supera i limiti dell&#8217;array appoggiandosi sempre ad un array che Go gestisce internamente.<\/p>\n\n\n\n<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\u00e0. La capacit\u00e0 \u00e8 opzionale ed in usa assenza verr\u00e0 inizializzata con il valore della lunghezza.<\/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 sl = make([]int, 0, 3)\n\tfmt.Println(len(sl), cap(sl))\n\tfor i := 0; i &lt; 5; i++ {\n\t\tsl = append(sl, i)\n\t\tfmt.Println(len(sl), cap(sl))\n\t}\n<\/pre>\n\n\n\n<p>Nell&#8217;esempio ho creato uno slice che non ha nessun elemento presente ma che prevede una capacit\u00e0 iniziale di 3 elementi, superati il quale Go estender\u00e0 in automatico.  Tramite il ciclo for aggiungo in coda un elemento che Go far\u00e0 senza problemi appoggiandosi ad un array virtualmente infinito. Infatti lo slice rappresenta una sezione di un array  di sistema<\/p>\n\n\n\n<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>\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 slbr []string = br[2:4]\n\tfmt.Println(slbr)\n\n\tvar slbr1 []string = br[:4]\n\tfmt.Println(slbr1)\n\n\tvar slbr2 []string = br[0:]\n\tfmt.Println(slbr2)\n\n\tvar slbr3 []string = br[:]\n\tfmt.Println(slbr3)\n\n\tvar slb3copy = make([]string, len(slbr3))\n\tcopy(slb3copy, slbr3)\n\tfmt.Println(slbr3, slb3copy)\n\n\tfor i, v := range slb3copy {\n\t\tfmt.Printf(\"%d = %s\\n\", i, v)\n\t}\n       \n       for i := range slb3copy {\n\t\tfmt.Printf(\"%d = %s\\n\", i, \"\")\n\t}\n\n\tfor _, v := range slb3copy {\n\t\tfmt.Printf(\"%d = %s\\n\", 0, v)\n\t}<\/pre>\n\n\n\n<p>Ogni modifica fatta sullo slice sar\u00e0 visibile sull&#8217;array e viceversa, proprio perch\u00e8 lo slice rappresenta una vista su quell&#8217;array. Tramite il comando copy sar\u00e0 possibile copiare il contenuto dello slice verso un altro slice.<\/p>\n\n\n\n<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>\n\n\n\n<p>Infine affrontiamo il concetto di map, che \u00e8 una struttura che rappresenta il concetto di chiave\/valore, e vediamo le operazioni che su di essa si possono effettuare,<\/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 mp map[string]string = make(map[string]string)\n\tmp[\"chiave\"] = \"valore\"\n\tfmt.Println(mp)\n\tdelete(mp, \"chiave\")\n\tfmt.Println(mp)\n\tmp[\"chiave1\"] = \"valore1\"\n\tmp[\"chiave2\"] = \"valore2\"\n\teleme, ok := mp[\"chiave2\"]\n\tfmt.Println(eleme, ok)\n\teleme1, ok1 := mp[\"chiave3\"]\n\tfmt.Println(eleme1, ok1)\n\tfor i, v := range mp {\n\t\tfmt.Println(i, v)\n\t}<\/pre>\n\n\n\n<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 \u00e8 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>\n\n\n\n<p>Alla prossima<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cosa \u00e8 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. &hellip; <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\">&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":[114,105,116,115],"_links":{"self":[{"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts\/606"}],"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=606"}],"version-history":[{"count":2,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts\/606\/revisions"}],"predecessor-version":[{"id":608,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts\/606\/revisions\/608"}],"wp:attachment":[{"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/media?parent=606"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/categories?post=606"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/tags?post=606"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}