{
    "componentChunkName": "component---node-modules-gatsby-theme-try-ghost-src-templates-post-js",
    "path": "/go-go-power-ra-go-parte-2-el-lenguaje-variables-tipos-primitivos/",
    "result": {"data":{"ghostPost":{"id":"Ghost__Post__5a338158333e0f134c248f0b","title":"Go Go Power Ra....ah que no: Go Parte 2 - El Lenguaje (Variables-Tipos Primitivos)","slug":"go-go-power-ra-go-parte-2-el-lenguaje-variables-tipos-primitivos","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Untitled-1.png","excerpt":"Vamos a ir viendo como trabajar con el lenguaje, es decir, como usar variables,\narrays, slices, estructuras...etc. He pensado que es mejor hacer post mas\ncortos, y asi público un poco más rápido, por lo que cada post realmente tratará\nunicamente de un tema.Sin entretenerme más empecemos a trabajar.\n\nVariables y Constantes\nPara los que no lo sepan, una variable es un elemento de un tipo\nespecífico(numeral, texto, etc) que usamos para gestionar y poder trabajar con\nellos. Después de este resumen e","custom_excerpt":null,"visibility":"public","created_at_pretty":"27 Jun 2017","published_at_pretty":"28 Jun 2017","updated_at_pretty":"11 Oct 2017","created_at":"2017-06-27T18:54:55.000+02:00","published_at":"2017-06-28T10:00:00.000+02:00","updated_at":"2017-10-11T13:44:35.000+02:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":null}],"primary_author":{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":{"base":"Perfil.jpg","publicURL":"/static/b0de6281fb28a266510b3b09b9243e5a/Perfil.jpg","imageMeta":{"width":307,"height":307},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGzw6zC6zHn+cLYP//EAB0QAAICAQUAAAAAAAAAAAAAAAEDAAIEEyEiIzL/2gAIAQEAAQUCifca8KgcKWVfUpkHsG5pxX//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARARcQISIUFR/9oACAEBAAY/AhU88xkb7N06a8P/xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMUFRYXH/2gAIAQEAAT8hR2pq40aqb+xIAeXibhW9JXr8joF4TBcSNe0//9oADAMBAAIAAwAAABDzDwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFhcfD/2gAIAQEAAT8QyItrELaTlatLwU63MvEW6vUNdy4LZQDn7iVApV9VLtANdWwKkuYq4Er1VZ//2Q==","aspectRatio":1,"src":"/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg","srcSet":"/static/b0de6281fb28a266510b3b09b9243e5a/f340b/Perfil.jpg 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/22d64/Perfil.jpg 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/aa249/Perfil.jpg 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/0dc33/Perfil.jpg 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/60667/Perfil.jpg 307w","srcWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp","srcSetWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/59cda/Perfil.webp 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/7da75/Perfil.webp 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f282e/Perfil.webp 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/a7b21/Perfil.webp 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f59af/Perfil.webp 307w","sizes":"(max-width: 110px) 100vw, 110px"}}}},"primary_tag":{"slug":"go","url":"https://jlgarcia.fulldev.ninja/tag/go/","name":"Go","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null},"tags":[{"slug":"go","url":"https://jlgarcia.fulldev.ninja/tag/go/","name":"Go","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null},{"slug":"golang","url":"https://jlgarcia.fulldev.ninja/tag/golang/","name":"Golang","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null}],"plaintext":"Vamos a ir viendo como trabajar con el lenguaje, es decir, como usar variables,\narrays, slices, estructuras...etc. He pensado que es mejor hacer post mas\ncortos, y asi público un poco más rápido, por lo que cada post realmente tratará\nunicamente de un tema.Sin entretenerme más empecemos a trabajar.\n\nVariables y Constantes\nPara los que no lo sepan, una variable es un elemento de un tipo\nespecífico(numeral, texto, etc) que usamos para gestionar y poder trabajar con\nellos. Después de este resumen extraño, comento con un poco más de tecnicismos,\nrealmente una variable es una dirección de memoria que reservamos donde\nalmacenamos el valor que contiene la variable. Esto es importante entenderlo, en\nlenguajes como Go sobretodo, porque el lenguaje usa punteros (los veremos más\nadelante, pero resumiendo es como un acceso directo a esa dirección de memoria)\n\nVamos a empezar con los tipos primitivos o básicos que tiene el lenguaje(como\ntal podemos crear nuestros propios tipos, pero eso ya lo veremos), aunque más\nque ver los tipos voy a hablar de como trabajar con ellos.\nLos tipos básicos en Go los tenéis o en la documentación oficial o más resumido\nen el tour [https://tour.golang.org/basics/11] oficial del lenguaje.\n\nEn Go las variables tienen un tipado estático, y ¿esto que quiere decir?, pues\nque a la hora de declararlas tenemos que indicar el tipo, el cual no cambia:\n\nvar power int\nvar rangerName string\n\n\nUn detalle importante, en Go no existe nil, null, undefined ni nada similar,\nsiempre, siempre, siempre las variables son iniciadas, si no lo son por\nnosotros, el lenguaje automáticamente le pone 0 o \"\", según el caso. Si\nintentamos imprimir eso:\n\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\n  var power int\n  var rangerName string\n\n  fmt.Println(\"Power ranger red power: \", power)\n  fmt.Println(\"Power ranger red name: \", rangerName)\n\n}\n\n\n\n\nEl int es 0 y el string esta vacio.\n\nEs posible tambien declarar varias variables del mismo tipo en la misma linea\n\nvar power,speed int\n\n\nLas variables es posible iniciarlas una vez que son declaradas(tambien si hemos\ndeclarado varias en la misma linea)\n\nvar power, speed int = 100,70\n\n\nSi imprimimos con:\n\n\tfmt.Println(\"Power ranger red power: \", power)\n\tfmt.Println(\"Power ranger red speed: \", speed)\n\n\n\nComo extra Go tiene otra forma bastante mas ágil de declarar variables e\niniciarlas que infiere el tipo (un poco de azúcar sintáctico)\n\npower := 100\nspeed := 70\n#Tambien podemos declarar varias a la vez\nstamina, swordsSkill := 50, 80\n# Y es posible usar distintos tipos en la misma declaración\nmegazordSkill, rangerName := 1000,\"Scott\"\n## Realmente tambien infiere el tipo si inicializamos al declarar una variable\nvar power = 100 seria igual que lo de arriba\n\n\nSi os fijais en la ultima declaración tenemos un int y un string, pues si\nimprimimos:\n\nfmt.Println(\"Power ranger red power: \", power)\nfmt.Println(\"Power ranger red speed: \", speed)\nfmt.Println(\"Power ranger red stamina: \", stamina)\nfmt.Println(\"Power ranger red swordsSkill: \", swordsSkill)\nfmt.Println(\"Power ranger red megazordSkill: \", megazordSkill)\nfmt.Println(\"Power ranger red name: \", rangerName)\n\n\n\n\nEn cuanto a las constantes comentar que como gran parte de los lenguajes Go\ntambién las tiene, básicamente es cambiar la palabra var por const:\n\nconst hello = \"Hello World\"\nconst hello string = \"Hello World\"\n\n\nTrabajar con distintos tipos\nGo no traduce entre tipos como otros lenguajes, por lo que tenemos que hacerlo\nnosotros, si probamos con este ejemplo:\n\njump := 60\ngravityForce := 9.8\nfmt.Println(v / p * 2)\n\n\nTendriamos este error:\n\n\nComo el error indica tenemos que igualar los tipos:\n\nfmt.Println(float64(jump) / gravityForce * 2)\n\n\nEsto ya no daria error y funcionaría sin problemas. No voy a especificar como\ntransformar los tipos de todas las variables porque eso en la documentación esta\nbien explicado, y tenéis ejemplos. Tambien tenemos funciones para transformar de\nString a int y viceversa(esto veremos algun ejemplo mas adelante pero insisto en\nla documentación viene bastante bien y es realmente sencillo).\nPara los que tenga bastante experiencia,comentar que es posible sobreescribir\nlos métodos propios que transforman todo en String,es decir lo que usa fmt, y\nhacer lo que nosotros queramos(esto lo veremos mas adelante), es bastante útil\ncuando no podemos imprimir algunos datos o funciones directamente por algún\nmotivo(por ejemplo con los struct)\n\nVariables Privadas y Públicas\nEn Go existe el concepto de variables públicas y privadas, las privadas solo son\nvisibles en el fichero donde estan.\nLa diferencia está en la declaración, si las declaramos con la primera letra en\nmayúsculas o en minusculas:\n\n * Minúsculas = Privada\n * Mayúsculas = Pública\n\nVeamos un ejemplo:\n\nCreemos una estructura de ficheros similar a esta donde tengamos el root del\nproyecto como comentamos en el post anterior:\n\nComo vemos tenemos un fichero main.go como hemos tenido siempre, una carpeta \nrangerModel y dentro de esta un fichero rangerModel.go\n\nEn rangerModel.go ponemos lo siguiente:\n\npackage rangerModel\n\nvar power int\nvar speed int\n\n\nComo vemos he puesto el nombre del paquete donde esta alojado para diferenciarlo\ndel main.\nEn el main.go:\n\npackage main\n\nimport (\n\t\"vuestroRootPath/rangerModel\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tpower := rangerModel.power\n\tfmt.Println(\"Power ranger red power:\", power)\n}\n\n\nSi guardamos ambos, vemos como nos da un error al instanciar el power del \nrangerModel:\n\nComo tal no tenemos acceso a la variable o propiedad power de rangerModel.\nAhora vamos a cambiar el power por Power en el modelo, quedando de esta\nmanera(de paso le ponemos un valor):\n\npackage rangerModel\n\nvar Power = 100\nvar speed int\n\n\nY lo mismo en el main:\n\nfunc main() {\n\tpower := rangerModel.Power\n\tfmt.Println(\"Power ranger red power:\", power)\n}\n\n\nAhora si imprimimos:\n\nEs bastante sencillo como veis, comentar que no es recomendable hacer variables\npúblicas(o exportar variables según el lenguaje de Go), por eso nos da esta\nrecomendación al ponerlo en mayúsculas:\n\n\nPor el momento dejamos aquí las variables básicas, más adelante seguiremos\ntrabajando con ellas.\nNos vemos en el siguiente","html":"<!--kg-card-begin: markdown--><p>Vamos a ir viendo como trabajar con el lenguaje, es decir, como usar variables, arrays, slices, estructuras...etc. He pensado que es mejor hacer post mas cortos, y asi público un poco más rápido, por lo que cada post realmente tratará unicamente de un tema.Sin entretenerme más empecemos a trabajar.</p>\n<h3 id=\"variablesyconstantes\">Variables y Constantes</h3>\n<p>Para los que no lo sepan, una variable es un elemento de un tipo específico(numeral, texto, etc) que usamos para gestionar y poder trabajar con ellos. Después de este resumen extraño, comento con un poco más de tecnicismos, realmente una variable es una dirección de memoria que reservamos donde almacenamos el valor que contiene la variable. Esto es importante entenderlo, en lenguajes como Go sobretodo, porque el lenguaje usa <strong>punteros</strong> (los veremos más adelante, pero resumiendo es como un acceso directo a esa dirección de memoria)</p>\n<p>Vamos a empezar con los tipos primitivos o básicos que tiene el lenguaje(como tal podemos crear nuestros propios tipos, pero eso ya lo veremos), aunque más que ver los tipos voy a hablar de como trabajar con ellos.<br>\nLos tipos básicos en Go los tenéis o en la documentación oficial o más resumido en el <a href=\"https://tour.golang.org/basics/11\">tour</a> oficial del lenguaje.</p>\n<p>En Go las variables tienen un tipado estático, y ¿esto que quiere decir?, pues que a la hora de declararlas tenemos que indicar el tipo, el cual no cambia:</p>\n<pre><code>var power int\nvar rangerName string\n</code></pre>\n<p>Un detalle <span style=\"color:red\">importante</span>, en Go no existe nil, null, undefined ni nada similar, siempre, siempre, siempre las variables son iniciadas, si no lo son por nosotros, el lenguaje automáticamente le pone 0 o &quot;&quot;, según el caso. Si intentamos imprimir eso:</p>\n<pre><code>package main\n\nimport &quot;fmt&quot;\n\nfunc main() {\n\n  var power int\n  var rangerName string\n\n  fmt.Println(&quot;Power ranger red power: &quot;, power)\n  fmt.Println(&quot;Power ranger red name: &quot;, rangerName)\n\n}\n\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-19.45.02.png\" alt=\"\"><br>\nEl int es 0 y el string esta vacio.</p>\n<p>Es posible tambien declarar varias variables del mismo tipo en la misma linea</p>\n<pre><code>var power,speed int\n</code></pre>\n<p>Las variables es posible iniciarlas una vez que son declaradas(tambien si hemos declarado varias en la misma linea)</p>\n<pre><code>var power, speed int = 100,70\n</code></pre>\n<p>Si imprimimos con:</p>\n<pre><code>\tfmt.Println(&quot;Power ranger red power: &quot;, power)\n\tfmt.Println(&quot;Power ranger red speed: &quot;, speed)\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-19.53.07.png\" alt=\"\"><br>\nComo extra Go tiene otra forma bastante mas ágil de declarar variables e iniciarlas que infiere el tipo (un poco de azúcar sintáctico)</p>\n<pre><code>power := 100\nspeed := 70\n#Tambien podemos declarar varias a la vez\nstamina, swordsSkill := 50, 80\n# Y es posible usar distintos tipos en la misma declaración\nmegazordSkill, rangerName := 1000,&quot;Scott&quot;\n## Realmente tambien infiere el tipo si inicializamos al declarar una variable\nvar power = 100 seria igual que lo de arriba\n</code></pre>\n<p>Si os fijais en la ultima declaración tenemos un int y un string, pues si imprimimos:</p>\n<pre><code>fmt.Println(&quot;Power ranger red power: &quot;, power)\nfmt.Println(&quot;Power ranger red speed: &quot;, speed)\nfmt.Println(&quot;Power ranger red stamina: &quot;, stamina)\nfmt.Println(&quot;Power ranger red swordsSkill: &quot;, swordsSkill)\nfmt.Println(&quot;Power ranger red megazordSkill: &quot;, megazordSkill)\nfmt.Println(&quot;Power ranger red name: &quot;, rangerName)\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.04.20.png\" alt=\"\"></p>\n<p>En cuanto a las <strong>constantes</strong> comentar que como gran parte de los lenguajes Go también las tiene, básicamente es cambiar la palabra <strong>var</strong> por <strong>const</strong>:</p>\n<pre><code>const hello = &quot;Hello World&quot;\nconst hello string = &quot;Hello World&quot;\n</code></pre>\n<h3 id=\"trabajarcondistintostipos\">Trabajar con distintos tipos</h3>\n<p>Go no traduce entre tipos como otros lenguajes, por lo que tenemos que hacerlo nosotros, si probamos con este ejemplo:</p>\n<pre><code>jump := 60\ngravityForce := 9.8\nfmt.Println(v / p * 2)\n</code></pre>\n<p>Tendriamos este error:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.11.51.png\" alt=\"\"></p>\n<p>Como el error indica tenemos que igualar los tipos:</p>\n<pre><code>fmt.Println(float64(jump) / gravityForce * 2)\n</code></pre>\n<p>Esto ya no daria error y funcionaría sin problemas. No voy a especificar como transformar los tipos de todas las variables porque eso en la documentación esta bien explicado, y tenéis ejemplos. Tambien tenemos funciones para transformar de String a int y viceversa(esto veremos algun ejemplo mas adelante pero insisto en la documentación viene bastante bien y es realmente sencillo).<br>\nPara los que tenga bastante experiencia,comentar que es posible sobreescribir los métodos propios que transforman todo en String,es decir lo que usa fmt, y hacer lo que nosotros queramos(esto lo veremos mas adelante), es bastante útil cuando no podemos imprimir algunos datos o funciones directamente por algún motivo(por ejemplo con los <strong>struct</strong>)</p>\n<h3 id=\"variablesprivadasypblicas\">Variables Privadas y Públicas</h3>\n<p>En Go existe el concepto de variables públicas y privadas,  las privadas solo son visibles en el fichero donde estan.<br>\nLa diferencia está en la declaración, si las declaramos con la primera letra en mayúsculas o en minusculas:</p>\n<ul>\n<li>Minúsculas = Privada</li>\n<li>Mayúsculas = Pública</li>\n</ul>\n<p>Veamos un ejemplo:</p>\n<p>Creemos una estructura de ficheros similar a esta donde tengamos el root del proyecto como comentamos en el post anterior:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.40.34.png\" alt=\"\"><br>\nComo vemos tenemos un fichero <strong>main.go</strong> como hemos tenido siempre, una carpeta <strong>rangerModel</strong> y dentro de esta un fichero <strong>rangerModel.go</strong></p>\n<p>En <strong>rangerModel.go</strong> ponemos lo siguiente:</p>\n<pre><code>package rangerModel\n\nvar power int\nvar speed int\n</code></pre>\n<p>Como vemos he puesto el nombre del paquete donde esta alojado para diferenciarlo del main.<br>\nEn el <strong>main.go</strong>:</p>\n<pre><code>package main\n\nimport (\n\t&quot;vuestroRootPath/rangerModel&quot;\n\t&quot;fmt&quot;\n)\n\nfunc main() {\n\tpower := rangerModel.power\n\tfmt.Println(&quot;Power ranger red power:&quot;, power)\n}\n</code></pre>\n<p>Si guardamos ambos, vemos como nos da un error al instanciar el <strong>power</strong> del <strong>rangerModel</strong>:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.46.31.png\" alt=\"\"><br>\nComo tal no tenemos acceso a la variable o propiedad <strong>power</strong> de <strong>rangerModel</strong>.<br>\nAhora vamos a cambiar el power por <strong>Power</strong> en el modelo, quedando de esta manera(de paso le ponemos un valor):</p>\n<pre><code>package rangerModel\n\nvar Power = 100\nvar speed int\n</code></pre>\n<p>Y lo mismo en el <strong>main</strong>:</p>\n<pre><code>func main() {\n\tpower := rangerModel.Power\n\tfmt.Println(&quot;Power ranger red power:&quot;, power)\n}\n</code></pre>\n<p>Ahora si imprimimos:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.50.04.png\" alt=\"\"><br>\nEs bastante sencillo como veis, comentar que no es recomendable hacer variables públicas(o exportar variables según el lenguaje de Go), por eso nos da esta recomendación al ponerlo en mayúsculas:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.54.51.png\" alt=\"\"></p>\n<p>Por el momento dejamos aquí las variables básicas, más adelante seguiremos trabajando con ellas.<br>\nNos vemos en el siguiente</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/go-go-power-ra-go-parte-2-el-lenguaje-variables-tipos-primitivos/","canonical_url":null,"uuid":"503e8403-6ffb-41ef-9618-d4bbe14b3250","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"23","reading_time":5,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Vamos a ir viendo como trabajar con el lenguaje, es decir, como usar variables, arrays, slices, estructuras...etc. He pensado que es mejor hacer post mas cortos, y asi público un poco más rápido, por lo que cada post realmente tratará unicamente de un tema.Sin entretenerme más empecemos a trabajar.</p>\n<h3 id=\"variablesyconstantes\">Variables y Constantes</h3>\n<p>Para los que no lo sepan, una variable es un elemento de un tipo específico(numeral, texto, etc) que usamos para gestionar y poder trabajar con ellos. Después de este resumen extraño, comento con un poco más de tecnicismos, realmente una variable es una dirección de memoria que reservamos donde almacenamos el valor que contiene la variable. Esto es importante entenderlo, en lenguajes como Go sobretodo, porque el lenguaje usa <strong>punteros</strong> (los veremos más adelante, pero resumiendo es como un acceso directo a esa dirección de memoria)</p>\n<p>Vamos a empezar con los tipos primitivos o básicos que tiene el lenguaje(como tal podemos crear nuestros propios tipos, pero eso ya lo veremos), aunque más que ver los tipos voy a hablar de como trabajar con ellos.<br>\nLos tipos básicos en Go los tenéis o en la documentación oficial o más resumido en el <a href=\"https://tour.golang.org/basics/11\">tour</a> oficial del lenguaje.</p>\n<p>En Go las variables tienen un tipado estático, y ¿esto que quiere decir?, pues que a la hora de declararlas tenemos que indicar el tipo, el cual no cambia:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">var power int\nvar rangerName string\n</code></pre></div>\n<p>Un detalle <span style=\"color:red\">importante</span>, en Go no existe nil, null, undefined ni nada similar, siempre, siempre, siempre las variables son iniciadas, si no lo son por nosotros, el lenguaje automáticamente le pone 0 o \"\", según el caso. Si intentamos imprimir eso:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">package main\n\nimport \"fmt\"\n\nfunc main() {\n\n  var power int\n  var rangerName string\n\n  fmt.Println(\"Power ranger red power: \", power)\n  fmt.Println(\"Power ranger red name: \", rangerName)\n\n}\n\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-19.45.02.png\" alt=\"\"><br>\nEl int es 0 y el string esta vacio.</p>\n<p>Es posible tambien declarar varias variables del mismo tipo en la misma linea</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">var power,speed int\n</code></pre></div>\n<p>Las variables es posible iniciarlas una vez que son declaradas(tambien si hemos declarado varias en la misma linea)</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">var power, speed int = 100,70\n</code></pre></div>\n<p>Si imprimimos con:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">\tfmt.Println(\"Power ranger red power: \", power)\n\tfmt.Println(\"Power ranger red speed: \", speed)\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-19.53.07.png\" alt=\"\"><br>\nComo extra Go tiene otra forma bastante mas ágil de declarar variables e iniciarlas que infiere el tipo (un poco de azúcar sintáctico)</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">power := 100\nspeed := 70\n#Tambien podemos declarar varias a la vez\nstamina, swordsSkill := 50, 80\n# Y es posible usar distintos tipos en la misma declaración\nmegazordSkill, rangerName := 1000,\"Scott\"\n## Realmente tambien infiere el tipo si inicializamos al declarar una variable\nvar power = 100 seria igual que lo de arriba\n</code></pre></div>\n<p>Si os fijais en la ultima declaración tenemos un int y un string, pues si imprimimos:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">fmt.Println(\"Power ranger red power: \", power)\nfmt.Println(\"Power ranger red speed: \", speed)\nfmt.Println(\"Power ranger red stamina: \", stamina)\nfmt.Println(\"Power ranger red swordsSkill: \", swordsSkill)\nfmt.Println(\"Power ranger red megazordSkill: \", megazordSkill)\nfmt.Println(\"Power ranger red name: \", rangerName)\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.04.20.png\" alt=\"\"></p>\n<p>En cuanto a las <strong>constantes</strong> comentar que como gran parte de los lenguajes Go también las tiene, básicamente es cambiar la palabra <strong>var</strong> por <strong>const</strong>:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">const hello = \"Hello World\"\nconst hello string = \"Hello World\"\n</code></pre></div>\n<h3 id=\"trabajarcondistintostipos\">Trabajar con distintos tipos</h3>\n<p>Go no traduce entre tipos como otros lenguajes, por lo que tenemos que hacerlo nosotros, si probamos con este ejemplo:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">jump := 60\ngravityForce := 9.8\nfmt.Println(v / p * 2)\n</code></pre></div>\n<p>Tendriamos este error:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.11.51.png\" alt=\"\"></p>\n<p>Como el error indica tenemos que igualar los tipos:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">fmt.Println(float64(jump) / gravityForce * 2)\n</code></pre></div>\n<p>Esto ya no daria error y funcionaría sin problemas. No voy a especificar como transformar los tipos de todas las variables porque eso en la documentación esta bien explicado, y tenéis ejemplos. Tambien tenemos funciones para transformar de String a int y viceversa(esto veremos algun ejemplo mas adelante pero insisto en la documentación viene bastante bien y es realmente sencillo).<br>\nPara los que tenga bastante experiencia,comentar que es posible sobreescribir los métodos propios que transforman todo en String,es decir lo que usa fmt, y hacer lo que nosotros queramos(esto lo veremos mas adelante), es bastante útil cuando no podemos imprimir algunos datos o funciones directamente por algún motivo(por ejemplo con los <strong>struct</strong>)</p>\n<h3 id=\"variablesprivadasypblicas\">Variables Privadas y Públicas</h3>\n<p>En Go existe el concepto de variables públicas y privadas,  las privadas solo son visibles en el fichero donde estan.<br>\nLa diferencia está en la declaración, si las declaramos con la primera letra en mayúsculas o en minusculas:</p>\n<ul>\n<li>Minúsculas = Privada</li>\n<li>Mayúsculas = Pública</li>\n</ul>\n<p>Veamos un ejemplo:</p>\n<p>Creemos una estructura de ficheros similar a esta donde tengamos el root del proyecto como comentamos en el post anterior:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.40.34.png\" alt=\"\"><br>\nComo vemos tenemos un fichero <strong>main.go</strong> como hemos tenido siempre, una carpeta <strong>rangerModel</strong> y dentro de esta un fichero <strong>rangerModel.go</strong></p>\n<p>En <strong>rangerModel.go</strong> ponemos lo siguiente:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">package rangerModel\n\nvar power int\nvar speed int\n</code></pre></div>\n<p>Como vemos he puesto el nombre del paquete donde esta alojado para diferenciarlo del main.<br>\nEn el <strong>main.go</strong>:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">package main\n\nimport (\n\t\"vuestroRootPath/rangerModel\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tpower := rangerModel.power\n\tfmt.Println(\"Power ranger red power:\", power)\n}\n</code></pre></div>\n<p>Si guardamos ambos, vemos como nos da un error al instanciar el <strong>power</strong> del <strong>rangerModel</strong>:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.46.31.png\" alt=\"\"><br>\nComo tal no tenemos acceso a la variable o propiedad <strong>power</strong> de <strong>rangerModel</strong>.<br>\nAhora vamos a cambiar el power por <strong>Power</strong> en el modelo, quedando de esta manera(de paso le ponemos un valor):</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">package rangerModel\n\nvar Power = 100\nvar speed int\n</code></pre></div>\n<p>Y lo mismo en el <strong>main</strong>:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">func main() {\n\tpower := rangerModel.Power\n\tfmt.Println(\"Power ranger red power:\", power)\n}\n</code></pre></div>\n<p>Ahora si imprimimos:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.50.04.png\" alt=\"\"><br>\nEs bastante sencillo como veis, comentar que no es recomendable hacer variables públicas(o exportar variables según el lenguaje de Go), por eso nos da esta recomendación al ponerlo en mayúsculas:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.54.51.png\" alt=\"\"></p>\n<p>Por el momento dejamos aquí las variables básicas, más adelante seguiremos trabajando con ellas.<br>\nNos vemos en el siguiente</p>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vamos a ir viendo como trabajar con el lenguaje, es decir, como usar variables, arrays, slices, estructuras...etc. He pensado que es mejor hacer post mas cortos, y asi público un poco más rápido, por lo que cada post realmente tratará unicamente de un tema.Sin entretenerme más empecemos a trabajar."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"variablesyconstantes"},"children":[{"type":"text","value":"Variables y Constantes"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para los que no lo sepan, una variable es un elemento de un tipo específico(numeral, texto, etc) que usamos para gestionar y poder trabajar con ellos. Después de este resumen extraño, comento con un poco más de tecnicismos, realmente una variable es una dirección de memoria que reservamos donde almacenamos el valor que contiene la variable. Esto es importante entenderlo, en lenguajes como Go sobretodo, porque el lenguaje usa "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"punteros"}]},{"type":"text","value":" (los veremos más adelante, pero resumiendo es como un acceso directo a esa dirección de memoria)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vamos a empezar con los tipos primitivos o básicos que tiene el lenguaje(como tal podemos crear nuestros propios tipos, pero eso ya lo veremos), aunque más que ver los tipos voy a hablar de como trabajar con ellos."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nLos tipos básicos en Go los tenéis o en la documentación oficial o más resumido en el "},{"type":"element","tagName":"a","properties":{"href":"https://tour.golang.org/basics/11"},"children":[{"type":"text","value":"tour"}]},{"type":"text","value":" oficial del lenguaje."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En Go las variables tienen un tipado estático, y ¿esto que quiere decir?, pues que a la hora de declararlas tenemos que indicar el tipo, el cual no cambia:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"var power int\nvar rangerName string\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Un detalle "},{"type":"element","tagName":"span","properties":{"style":"color:red"},"children":[{"type":"text","value":"importante"}]},{"type":"text","value":", en Go no existe nil, null, undefined ni nada similar, siempre, siempre, siempre las variables son iniciadas, si no lo son por nosotros, el lenguaje automáticamente le pone 0 o \"\", según el caso. Si intentamos imprimir eso:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"package main\n\nimport \"fmt\"\n\nfunc main() {\n\n  var power int\n  var rangerName string\n\n  fmt.Println(\"Power ranger red power: \", power)\n  fmt.Println(\"Power ranger red name: \", rangerName)\n\n}\n\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-19.45.02.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEl int es 0 y el string esta vacio."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Es posible tambien declarar varias variables del mismo tipo en la misma linea"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"var power,speed int\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Las variables es posible iniciarlas una vez que son declaradas(tambien si hemos declarado varias en la misma linea)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"var power, speed int = 100,70\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si imprimimos con:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\tfmt.Println(\"Power ranger red power: \", power)\n\tfmt.Println(\"Power ranger red speed: \", speed)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-19.53.07.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nComo extra Go tiene otra forma bastante mas ágil de declarar variables e iniciarlas que infiere el tipo (un poco de azúcar sintáctico)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"power := 100\nspeed := 70\n#Tambien podemos declarar varias a la vez\nstamina, swordsSkill := 50, 80\n# Y es posible usar distintos tipos en la misma declaración\nmegazordSkill, rangerName := 1000,\"Scott\"\n## Realmente tambien infiere el tipo si inicializamos al declarar una variable\nvar power = 100 seria igual que lo de arriba\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si os fijais en la ultima declaración tenemos un int y un string, pues si imprimimos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fmt.Println(\"Power ranger red power: \", power)\nfmt.Println(\"Power ranger red speed: \", speed)\nfmt.Println(\"Power ranger red stamina: \", stamina)\nfmt.Println(\"Power ranger red swordsSkill: \", swordsSkill)\nfmt.Println(\"Power ranger red megazordSkill: \", megazordSkill)\nfmt.Println(\"Power ranger red name: \", rangerName)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.04.20.png","alt":""},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En cuanto a las "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"constantes"}]},{"type":"text","value":" comentar que como gran parte de los lenguajes Go también las tiene, básicamente es cambiar la palabra "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"var"}]},{"type":"text","value":" por "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"const"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"const hello = \"Hello World\"\nconst hello string = \"Hello World\"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"trabajarcondistintostipos"},"children":[{"type":"text","value":"Trabajar con distintos tipos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Go no traduce entre tipos como otros lenguajes, por lo que tenemos que hacerlo nosotros, si probamos con este ejemplo:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jump := 60\ngravityForce := 9.8\nfmt.Println(v / p * 2)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tendriamos este error:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.11.51.png","alt":""},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como el error indica tenemos que igualar los tipos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fmt.Println(float64(jump) / gravityForce * 2)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto ya no daria error y funcionaría sin problemas. No voy a especificar como transformar los tipos de todas las variables porque eso en la documentación esta bien explicado, y tenéis ejemplos. Tambien tenemos funciones para transformar de String a int y viceversa(esto veremos algun ejemplo mas adelante pero insisto en la documentación viene bastante bien y es realmente sencillo)."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nPara los que tenga bastante experiencia,comentar que es posible sobreescribir los métodos propios que transforman todo en String,es decir lo que usa fmt, y hacer lo que nosotros queramos(esto lo veremos mas adelante), es bastante útil cuando no podemos imprimir algunos datos o funciones directamente por algún motivo(por ejemplo con los "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"struct"}]},{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"variablesprivadasypblicas"},"children":[{"type":"text","value":"Variables Privadas y Públicas"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En Go existe el concepto de variables públicas y privadas,  las privadas solo son visibles en el fichero donde estan."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nLa diferencia está en la declaración, si las declaramos con la primera letra en mayúsculas o en minusculas:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Minúsculas = Privada"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Mayúsculas = Pública"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos un ejemplo:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Creemos una estructura de ficheros similar a esta donde tengamos el root del proyecto como comentamos en el post anterior:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.40.34.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nComo vemos tenemos un fichero "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"main.go"}]},{"type":"text","value":" como hemos tenido siempre, una carpeta "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"rangerModel"}]},{"type":"text","value":" y dentro de esta un fichero "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"rangerModel.go"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"rangerModel.go"}]},{"type":"text","value":" ponemos lo siguiente:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"package rangerModel\n\nvar power int\nvar speed int\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como vemos he puesto el nombre del paquete donde esta alojado para diferenciarlo del main."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEn el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"main.go"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"package main\n\nimport (\n\t\"vuestroRootPath/rangerModel\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tpower := rangerModel.power\n\tfmt.Println(\"Power ranger red power:\", power)\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si guardamos ambos, vemos como nos da un error al instanciar el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"power"}]},{"type":"text","value":" del "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"rangerModel"}]},{"type":"text","value":":"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.46.31.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nComo tal no tenemos acceso a la variable o propiedad "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"power"}]},{"type":"text","value":" de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"rangerModel"}]},{"type":"text","value":"."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nAhora vamos a cambiar el power por "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Power"}]},{"type":"text","value":" en el modelo, quedando de esta manera(de paso le ponemos un valor):"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"package rangerModel\n\nvar Power = 100\nvar speed int\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y lo mismo en el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"main"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"func main() {\n\tpower := rangerModel.Power\n\tfmt.Println(\"Power ranger red power:\", power)\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora si imprimimos:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.50.04.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEs bastante sencillo como veis, comentar que no es recomendable hacer variables públicas(o exportar variables según el lenguaje de Go), por eso nos da esta recomendación al ponerlo en mayúsculas:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-27-a-las-20.54.51.png","alt":""},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Por el momento dejamos aquí las variables básicas, más adelante seguiremos trabajando con ellas."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nNos vemos en el siguiente"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"variablesyconstantes","heading":"Variables y Constantes"},{"id":"trabajarcondistintostipos","heading":"Trabajar con distintos tipos"},{"id":"variablesprivadasypblicas","heading":"Variables Privadas y Públicas"}]},"featureImageSharp":{"base":"Untitled-1.png","publicURL":"/static/4c2a69b59a578389653f7d3cb966f439/Untitled-1.png","imageMeta":{"width":649,"height":244},"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABr0lEQVQoz22RPWhTURiGP+29N/eec3/aK1FjI9RBm3aSSBVBDVSzOGpwiMEhKopmsCnYyUVQwS5WxKU6iGBwdOrQqZOD+EO1HYo/mCBtySSC6+O5CQVjHF7ecw7veb6Xc0RrTa8USnV9S57ZZ2LF3rTqeBwqhiIf3++X9AO3YN11AlfGx7KKyTGX4nhXx/YJg9pGZBuOYxs5WJbVC1QdQBfm6oAwCnl+wWFixDMXPbZbGjulicx58dQko6MHKBQK5HK5jvL5/D8NDcz3NQOO4khGaJSElxXh4knFiaMZTh/22b/HwbYdpms1zpVKTNXrlMtlKpUK1Wq1v2ECVdrHPVPi+N0pns2eZ/7FNFdeP+FVY4a5xzfZcf8BA9fr7B4eZjCKSKfTZLNZ4jj+D9B1CXbuQu495OzaBt/ffWJh5RvF5m9azTbrq2tMfN1E5uZRQYhn8q7nkUql8Iz3ApN2QUAggly6xsjndRY32zz68J6Dtcs8ffuG280NrC9trOpVfJPTYdjzoX1vmEzVJmjfmEFaP5HlJoeWllhuzFJYXEA+tpAfv7Bu3enkkrz6i/EHdxf7UmCHE+cAAAAASUVORK5CYII=","aspectRatio":2.6530612244897958,"src":"/static/4c2a69b59a578389653f7d3cb966f439/d382d/Untitled-1.png","srcSet":"/static/4c2a69b59a578389653f7d3cb966f439/bcfcb/Untitled-1.png 260w,\n/static/4c2a69b59a578389653f7d3cb966f439/19d75/Untitled-1.png 520w,\n/static/4c2a69b59a578389653f7d3cb966f439/d382d/Untitled-1.png 649w","srcWebp":"/static/4c2a69b59a578389653f7d3cb966f439/10386/Untitled-1.webp","srcSetWebp":"/static/4c2a69b59a578389653f7d3cb966f439/dc8f3/Untitled-1.webp 260w,\n/static/4c2a69b59a578389653f7d3cb966f439/2db4b/Untitled-1.webp 520w,\n/static/4c2a69b59a578389653f7d3cb966f439/10386/Untitled-1.webp 649w","sizes":"(max-width: 649px) 100vw, 649px"}}}},"prev":{"id":"Ghost__Post__5a338158333e0f134c248f0c","title":"Go Go Power Ra....ah que no: Go Parte 3 - Arrays y Slices I","slug":"go-go-power-ra-ah-que-no-go-parte-3-arrays-y-slices-i","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Untitled-2.png","excerpt":"En Go tenemos dos tipos de arrays o arreglos:\n\n * Los que llaman arrays, son arreglos con una cantidad definida de elementos,es\n   decir, tienen un tamaño fijo y no pueden crecer.\n   \n   \n * Los llamados slices, que son los arreglos o arrays más comunes, en los cuales\n   podemos añadir los elementos que queramos.\n   \n   \n\nY porque tenemos dos tipos? Pues básicamente es por el consumo de recursos, los \narrays definidos, solo se reservan los recursos que necesitan, los slices o\nllamemoslos arrays ","custom_excerpt":null,"visibility":"public","created_at_pretty":"3 Jul 2017","published_at_pretty":"11 Jul 2017","updated_at_pretty":"11 Oct 2017","created_at":"2017-07-03T21:39:27.000+02:00","published_at":"2017-07-11T22:11:39.000+02:00","updated_at":"2017-10-11T13:45:11.000+02:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":null}],"primary_author":{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":{"base":"Perfil.jpg","publicURL":"/static/b0de6281fb28a266510b3b09b9243e5a/Perfil.jpg","imageMeta":{"width":307,"height":307},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGzw6zC6zHn+cLYP//EAB0QAAICAQUAAAAAAAAAAAAAAAEDAAIEEyEiIzL/2gAIAQEAAQUCifca8KgcKWVfUpkHsG5pxX//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARARcQISIUFR/9oACAEBAAY/AhU88xkb7N06a8P/xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMUFRYXH/2gAIAQEAAT8hR2pq40aqb+xIAeXibhW9JXr8joF4TBcSNe0//9oADAMBAAIAAwAAABDzDwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFhcfD/2gAIAQEAAT8QyItrELaTlatLwU63MvEW6vUNdy4LZQDn7iVApV9VLtANdWwKkuYq4Er1VZ//2Q==","aspectRatio":1,"src":"/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg","srcSet":"/static/b0de6281fb28a266510b3b09b9243e5a/f340b/Perfil.jpg 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/22d64/Perfil.jpg 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/aa249/Perfil.jpg 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/0dc33/Perfil.jpg 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/60667/Perfil.jpg 307w","srcWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp","srcSetWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/59cda/Perfil.webp 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/7da75/Perfil.webp 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f282e/Perfil.webp 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/a7b21/Perfil.webp 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f59af/Perfil.webp 307w","sizes":"(max-width: 110px) 100vw, 110px"}}}},"primary_tag":{"slug":"go","url":"https://jlgarcia.fulldev.ninja/tag/go/","name":"Go","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null},"tags":[{"slug":"go","url":"https://jlgarcia.fulldev.ninja/tag/go/","name":"Go","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null},{"slug":"golang","url":"https://jlgarcia.fulldev.ninja/tag/golang/","name":"Golang","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null}],"plaintext":"En Go tenemos dos tipos de arrays o arreglos:\n\n * Los que llaman arrays, son arreglos con una cantidad definida de elementos,es\n   decir, tienen un tamaño fijo y no pueden crecer.\n   \n   \n * Los llamados slices, que son los arreglos o arrays más comunes, en los cuales\n   podemos añadir los elementos que queramos.\n   \n   \n\nY porque tenemos dos tipos? Pues básicamente es por el consumo de recursos, los \narrays definidos, solo se reservan los recursos que necesitan, los slices o\nllamemoslos arrays dinámicos tienen siempre reservado una cantidad mayor de\nrecursos para poder crecer. Más abajo veremos como saber esta cantidad.\n\nArrays definidos\nLa forma de declararlos es bastante sencilla:\n\n//supongamos que son 3\nvar rangers [3]string\nrangers[0] = \"Ranger Rojo\"\nrangers[1] = \"Ranger Negro\"\nrangers[2] = \"Ranger Amarillo\"\n\n//El uso es como todos los arrays\nfmt.Println(rangers)\nfmt.Println(rangers[0])\nfmt.Println(rangers[1])\nfmt.Println(rangers[2])\n\n\nSi ejecutamos esto:\n\n\nHasta aqui todo parece normal, vamos a intentar añadir alguno mas:\n\nrangers[3] = \"Ranger Verde\"\n\n\nVemos como el propio visual studio nos avisa:\n\nLa única forma que tendriamos de ampliar ese array, o más bien de trabajar con\nlos datos que contiene, es hacer una copia del array en otro con más cantidad de\nelementos posibles(o que fuera un slice).\n\nMás abajo veremos como hacer eso, ya que es común para ambos tipos de array.\n\nSLICES\nContinuemos con los slices, que serán posiblemente el tipo más usado, sobretodo\nal principio.\nTenemos varias formas de crear slices, cada una tiene sus peculiaridades.\nLa primera:\n\nvar rangers []string\n\nrangers[0] = \"Ranger Rosa\"\nfmt.Println(rangers)\n\n\nEn un principio todo parece normal, el compilador no se queja tampoco, cool,\npero vamos a ejecutarlo:\n\nComo veis tenemos un bonito Panic (para el que no se lo imagine es como muestra\nlos errores) pero ¿porque?\n\nGo al inicializar los slices si lo hacemos de esa forma los inicializa por\ndefecto \"vacios\" pero no entendamos vacios como cualquier otro elemento que\npodemos asignarle un valor directamente, si no lo inicializa con \"ausencia de\ntodo\" incluso de tamaño.\nPero esto no significa que no podamos usarlo, Go tiene un método append que nos\npermite añadir los elementos que necesitemos:\n\nrangers = append(rangers, \"Ranger Rosa\", \"Ranger Rojo\")\n\nfmt.Println(rangers)\n\n\nPodriamos añadir todos los que queramos, y como vemos funciona perfectamente:\n\n\nAntes de continuar con la siguiente forma de inicializar slices vamos a hablar\nde \"Tamaño\" y \"Capacidad\"\n\n¿¿??\n\nSi jejejeje, con los slices en aplicaciones complejas tendremos que tener en\ncuenta estas dos cosas, pensando en la optimización por supuesto.\n\n * Tamaño: Básicamente es el tamaño que tiene ocupado el slice, lo que en otros\n   lenguajes consultaríamos con un array.length\n   \n   \n * Capacidad: Es la cantidad de recursos reservada para ese slice.\n   \n   \n\nEs decir si pensamos en los slices como cajas, tenemos que un slice con una\ncapacidad de 5 son 5 cajas, de las cuales 2 estan cerradas con algo\ndentro(tamaño 2) y otras 3 estan abiertas a la espera de tener algo dentro, pero\nestan ocupando su espacio en el suelo ya.\n\nAhora veamos la segunda forma de crear un slice:\n\nrangers := make([]string,10)\n//Aqui tendriamos un slice con 10 de tamaño y 10 de capacidad\n\nrangers := make([]string,5,10)\n//Y aqui tendriamos un slice con 5 de tamaño y 10 de capacidad\n\n\nVeamos un ejemplo de código para ilustrar un poco mejor esto:\n\nvar rangers []string\nfmt.Println(\"Sin inicializar, es decir tamaño 0\")\nfmt.Println(rangers)\n\nrangers = append(rangers, \"Ranger Rosa\", \"Ranger Rojo\")\n\nfmt.Println(\"Append al no inicializado\")\nfmt.Println(rangers)\n\nrangers2 := make([]string, 10)\n\nfmt.Println(\"Usando make para asignar tamaño y capacidad iguales\")\nfmt.Println(rangers2)\n\nrangers3 := make([]string, 5, 10)\n\nfmt.Println(\"Usando make para asignar tamaño y capacidad distintos\")\nfmt.Println(rangers3)\n\n\nSi ejecutamos este código tendriamos un resultado como este:\n\nSi os fijais tenemos bastantes diferencias en cuanto a la inicialización por\ndefecto de cada uno de los slices, el primero realmente tendria un valor similar\na null, en el segundo hemos inicializado ese null con dos elementos, en el \ntercero se ha aplicado la inicialización por defecto de go de strings(es decir\n\"\") sobre 10 elementos, en el ultimo esa misma inicialización sobre 5.\n\nAhora ya podemos usar lo que llamariamos asignación directa:\n\nrangers2[2] = \"Ranger Verde\"\nrangers3[3] = \"Ranger Negro\"\n\nfmt.Println(rangers2)\nfmt.Println(rangers3)\n\n\n\n\nBien hemos comprobado que podemos añadir ahora por lo menos dentro del \"tamaño\ninicializado\", si nos fijamos cada elemento tiene una posición definida dentro\ndel slice. Veamos ahora lo que pasa si intentamos añadir en una ubicación por\nencima del tamaño(ojo no de la capacidad). Lo vamos a intentar on ranger3 que\ntiene una capacidad de 10 y un tamaño de 5:\n\n\nVemos como nos vuelve a dar el error de que nos hemos salido del rango\npermitido. Para añadir por encima de esto tenemos que usar el mismo método que\nantes con append\n\nrangers3 = append(rangers3, \"Ranger Rosa\", \"Ranger Rojo\")\nfmt.Println(rangers3)\n\n\nSi ahora ejecutamos veremos como despues del espacio que teniamos antes ha\nañadido los dos rangers nuevos.\n\nOJO a lo de los espacios vamos a ver una ultima forma de inicializar Arrays y \nSlices y volveremos a este ejemplo para ver cosas sobre la capacidad y el tamaño\n.\n\nComo última forma vamos a ver la inicialización directa de ambos casos:\n\n//Array definido\nrangers2 := [2]string{\"Ranger Verde\", \"Ranger Blanco\"}\n//Slice\nrangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\t\nfmt.Println(rangers2)\t\nfmt.Println(rangers3)\n\n\nComo tal no notamos ninguna diferencia a la hora de mostrarlos:\n\n\nAtención si hacemos esto:\n\nrangers2 := [3]string{\"Ranger Verde\", \"Ranger Blanco\"}\n\n\nNos añade,en este caso un string(podria ser cualquier tipo que hubieramos\nindicado) vacio en el elemento faltante.\n\nBien ahora vamos a probar a añadir:\n\nrangers2 := [2]string{\"Ranger Verde\", \"Ranger Blanco\"}\nrangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nrangers2 = append(rangers2, \"Ranger Negro\")\nrangers3 = append(rangers3, \"Ranger Blanco\")\n\n\nSi vemos el array definido se queja:\n\n\nComo tal sigue restringiendo su ampliación, lo contrario que el slice.\nAhora vamos a ver la diferencia real entre uno y otro.\n\nLen y Cap\nGo tiene como casi todos los lenguajes una forma de comprobar la cantidad de\nelementos que tiene un array,normalmente suele tener que ver con length, pues Go\nno iba a ser menos tenemos nuestro len:\n\nrangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nfmt.Println(len(rangers3))\n\n\nEsto nos devuelve un 2, cosa normal no?? Pero como tal antes hemos hablado de la \ncapacidad también, en este caso Go tiene también una forma de ver la capacidad\nque tenemos reservada(básicamente es reserva en memoria)\n\nrangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nfmt.Println(\"Tamaño\",len(rangers3))\nfmt.Println(\"Capacidad\",cap(rangers3))\n\n\nEsto nos devolveria:\n\n\nHasta aqui todo normal no?? Todo tiene sentido verdad?? Vale ahora vamos a\nañadirle algo para aumentarlo, recordemos que con capacidad 2 no podemos usar\nasignación directa para los siguientes elementos como tal tenemos que usar \nappend, vamos a usar append y veamos que nos devuelve ahora:\n\nrangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nrangers3 = append(rangers3, \"Ranger Blanco\")\n\nfmt.Println(\"Tamaño\", len(rangers3))\nfmt.Println(\"Capacidad\", cap(rangers3))\n\n\nPara nuestra sorpresa al ejecutar vemos esto:\n\nUPS!!! y que ha pasaaaaaooooo!!!????, es simple Go lo que hace es duplicar la\ncapacidad anterior, por lo que si no tenemos en cuenta y tratamos con slices muy\ngrandes, por ejemplo imaginemos un array de 100 elementos, si añadimos 1 mas\npara hacer 101 tendriamos una capacidad de 200 siendo realmente inecesario.\nVeamoslo con un ejemplo añadiendo al código anterior los 2 rangers restantes:\n\nrangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nrangers3 = append(rangers3, \"Ranger Blanco\")\n\nfmt.Println(\"Tamaño\", len(rangers3))\nfmt.Println(\"Capacidad\", cap(rangers3))\n\nrangers3 = append(rangers3, \"Ranger Rojo\", \"Ranger Negro\")\n\nfmt.Println(\"Tamaño\", len(rangers3))\nfmt.Println(\"Capacidad\", cap(rangers3))\n\n\nVemos que tenemos de repente una capacidad de 8:\n\n\nCreo que con esto mas o menos queda clara la diferencia entre los arrays\ndefinidos y los slices, hablando de consumo de memoria y del propio uso de uno u\notro, siempre sera recomendable tener arrays definidos, veremos más adelante\nalguna forma de pasar de uno a otro.\n\nEn el próximo post veremos tambien como trabajar con ambos, para recorrerlos,\npor ejemplo, y varias cosas mas.","html":"<!--kg-card-begin: markdown--><p>En Go tenemos dos tipos de <strong>arrays</strong> o <strong>arreglos</strong>:</p>\n<ul>\n<li>\n<p>Los que llaman <strong>arrays</strong>, son arreglos con una cantidad definida de elementos,es decir, tienen un tamaño fijo y no pueden crecer.</p>\n</li>\n<li>\n<p>Los llamados <strong>slices</strong>, que son los arreglos o arrays más comunes, en los cuales podemos añadir los elementos que queramos.</p>\n</li>\n</ul>\n<p>Y porque tenemos dos tipos? Pues básicamente es por el consumo de recursos, los <strong>arrays definidos</strong>, solo se reservan los recursos que necesitan, los <strong>slices</strong> o llamemoslos <strong>arrays dinámicos</strong> tienen siempre reservado una cantidad mayor de recursos para poder crecer. Más abajo veremos como saber esta cantidad.</p>\n<h2 id=\"arraysdefinidos\">Arrays definidos</h2>\n<p>La forma de declararlos es bastante sencilla:</p>\n<pre><code>//supongamos que son 3\nvar rangers [3]string\nrangers[0] = &quot;Ranger Rojo&quot;\nrangers[1] = &quot;Ranger Negro&quot;\nrangers[2] = &quot;Ranger Amarillo&quot;\n\n//El uso es como todos los arrays\nfmt.Println(rangers)\nfmt.Println(rangers[0])\nfmt.Println(rangers[1])\nfmt.Println(rangers[2])\n</code></pre>\n<p>Si ejecutamos esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen0814.png\" alt=\"\"></p>\n<p>Hasta aqui todo parece normal, vamos a intentar añadir alguno mas:</p>\n<pre><code>rangers[3] = &quot;Ranger Verde&quot;\n</code></pre>\n<p>Vemos como el propio visual studio nos avisa:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen0831.png\" alt=\"\"><br>\nLa única forma que tendriamos de ampliar ese array, o más bien de trabajar con los datos que contiene, es hacer una copia del array en otro con más cantidad de elementos posibles(o que fuera un <strong>slice</strong>).</p>\n<p>Más abajo veremos como hacer eso, ya que es común para ambos tipos de array.</p>\n<h2 id=\"slices\">SLICES</h2>\n<p>Continuemos con los <strong>slices</strong>, que serán posiblemente el tipo más usado, sobretodo al principio.<br>\nTenemos varias formas de crear <strong>slices</strong>, cada una tiene sus peculiaridades.<br>\nLa primera:</p>\n<pre><code>var rangers []string\n\nrangers[0] = &quot;Ranger Rosa&quot;\nfmt.Println(rangers)\n</code></pre>\n<p>En un principio todo parece normal, el compilador no se queja tampoco, <em>cool</em>, pero vamos a ejecutarlo:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen08.45.05.png\" alt=\"\"><br>\nComo veis tenemos un bonito <span style=\"color:red\">Panic</span> (para el que no se lo imagine es como muestra los errores) pero ¿porque?</p>\n<p>Go al inicializar los <strong>slices</strong> si lo hacemos de esa forma los inicializa por defecto <strong>&quot;vacios&quot;</strong> pero no entendamos vacios como cualquier otro elemento que podemos asignarle un valor directamente, si no lo inicializa con <strong>&quot;ausencia de todo&quot;</strong> incluso de tamaño.<br>\nPero esto no significa que no podamos usarlo, Go tiene un método <strong>append</strong> que nos permite añadir los elementos que necesitemos:</p>\n<pre><code>rangers = append(rangers, &quot;Ranger Rosa&quot;, &quot;Ranger Rojo&quot;)\n\nfmt.Println(rangers)\n</code></pre>\n<p>Podriamos añadir todos los que queramos, y como vemos funciona perfectamente:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen08.57.07.png\" alt=\"\"></p>\n<p>Antes de continuar con la siguiente forma de inicializar <strong>slices</strong> vamos a hablar de <strong>&quot;Tamaño&quot;</strong> y <strong>&quot;Capacidad&quot;</strong></p>\n<p>¿¿??</p>\n<p>Si jejejeje, con los slices en aplicaciones complejas tendremos que tener en cuenta estas dos cosas, pensando en la optimización por supuesto.</p>\n<ul>\n<li>\n<p><strong>Tamaño</strong>: Básicamente es el tamaño que tiene ocupado el slice, lo que en otros lenguajes consultaríamos con un <strong>array.length</strong></p>\n</li>\n<li>\n<p><strong>Capacidad</strong>: Es la cantidad de recursos reservada para ese <strong>slice</strong>.</p>\n</li>\n</ul>\n<p>Es decir si pensamos en los slices como cajas, tenemos que un slice con una capacidad de 5 son 5 cajas, de las cuales 2 estan cerradas con algo dentro(tamaño 2) y otras 3 estan abiertas a la espera de tener algo dentro, pero estan ocupando su espacio en el suelo ya.</p>\n<p>Ahora veamos la segunda forma de crear un <strong>slice</strong>:</p>\n<pre><code>rangers := make([]string,10)\n//Aqui tendriamos un slice con 10 de tamaño y 10 de capacidad\n\nrangers := make([]string,5,10)\n//Y aqui tendriamos un slice con 5 de tamaño y 10 de capacidad\n</code></pre>\n<p>Veamos un ejemplo de código para ilustrar un poco mejor esto:</p>\n<pre><code>var rangers []string\nfmt.Println(&quot;Sin inicializar, es decir tamaño 0&quot;)\nfmt.Println(rangers)\n\nrangers = append(rangers, &quot;Ranger Rosa&quot;, &quot;Ranger Rojo&quot;)\n\nfmt.Println(&quot;Append al no inicializado&quot;)\nfmt.Println(rangers)\n\nrangers2 := make([]string, 10)\n\nfmt.Println(&quot;Usando make para asignar tamaño y capacidad iguales&quot;)\nfmt.Println(rangers2)\n\nrangers3 := make([]string, 5, 10)\n\nfmt.Println(&quot;Usando make para asignar tamaño y capacidad distintos&quot;)\nfmt.Println(rangers3)\n</code></pre>\n<p>Si ejecutamos este código tendriamos un resultado como este:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen09.30.55.png\" alt=\"\"><br>\nSi os fijais tenemos bastantes diferencias en cuanto a la inicialización por defecto de cada uno de los slices, el <strong>primero</strong> realmente tendria un valor similar a <strong>null</strong>, en el <strong>segundo</strong> hemos inicializado ese null con dos elementos, en el <strong>tercero</strong> se ha aplicado la inicialización por defecto de go de strings(es decir &quot;&quot;) sobre 10 elementos, en el <strong>ultimo</strong> esa misma inicialización sobre 5.</p>\n<p>Ahora ya podemos usar lo que llamariamos asignación directa:</p>\n<pre><code>rangers2[2] = &quot;Ranger Verde&quot;\nrangers3[3] = &quot;Ranger Negro&quot;\n\nfmt.Println(rangers2)\nfmt.Println(rangers3)\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen20.56.57.png\" alt=\"\"></p>\n<p>Bien hemos comprobado que podemos añadir ahora por lo menos dentro del &quot;tamaño inicializado&quot;, si nos fijamos cada elemento tiene una posición definida dentro del slice. Veamos ahora lo que pasa si intentamos añadir en una ubicación por encima del <strong>tamaño</strong>(ojo no de la capacidad). Lo vamos a intentar on <strong>ranger3</strong> que tiene una capacidad de 10 y un tamaño de 5:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.00.34.png\" alt=\"\"></p>\n<p>Vemos como nos vuelve a dar el error de que nos hemos salido del rango permitido. Para añadir por encima de esto tenemos que usar el mismo método que antes con <strong>append</strong></p>\n<pre><code>rangers3 = append(rangers3, &quot;Ranger Rosa&quot;, &quot;Ranger Rojo&quot;)\nfmt.Println(rangers3)\n</code></pre>\n<p>Si ahora ejecutamos veremos como despues del espacio que teniamos antes ha añadido los dos rangers nuevos.<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.06.25.png\" alt=\"\"><br>\n<strong>OJO a lo de los espacios</strong> vamos a ver una ultima forma de inicializar <strong>Arrays</strong> y <strong>Slices</strong> y volveremos a este ejemplo para ver cosas sobre la <strong>capacidad</strong> y el <strong>tamaño</strong>.</p>\n<p>Como última forma vamos a ver la inicialización directa de ambos casos:</p>\n<pre><code>//Array definido\nrangers2 := [2]string{&quot;Ranger Verde&quot;, &quot;Ranger Blanco&quot;}\n//Slice\nrangers3 := []string{&quot;Ranger Rosa&quot;, &quot;Ranger Amarillo&quot;}\n\t\nfmt.Println(rangers2)\t\nfmt.Println(rangers3)\n</code></pre>\n<p>Como tal no notamos ninguna diferencia a la hora de mostrarlos:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.17.55.png\" alt=\"\"></p>\n<p><strong>Atención</strong> si hacemos esto:</p>\n<pre><code>rangers2 := [3]string{&quot;Ranger Verde&quot;, &quot;Ranger Blanco&quot;}\n</code></pre>\n<p>Nos añade,en este caso un string(podria ser cualquier tipo que hubieramos indicado) vacio en el elemento faltante.</p>\n<p>Bien ahora vamos a probar a añadir:</p>\n<pre><code>rangers2 := [2]string{&quot;Ranger Verde&quot;, &quot;Ranger Blanco&quot;}\nrangers3 := []string{&quot;Ranger Rosa&quot;, &quot;Ranger Amarillo&quot;}\n\nrangers2 = append(rangers2, &quot;Ranger Negro&quot;)\nrangers3 = append(rangers3, &quot;Ranger Blanco&quot;)\n</code></pre>\n<p>Si vemos el <strong>array definido</strong> se queja:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.20.36.png\" alt=\"\"></p>\n<p>Como tal sigue restringiendo su ampliación, lo contrario que el <strong>slice</strong>.<br>\nAhora vamos a ver la diferencia real entre uno y otro.</p>\n<h2 id=\"lenycap\">Len y Cap</h2>\n<p>Go tiene como casi todos los lenguajes una forma de comprobar la cantidad de elementos que tiene un array,normalmente suele tener que ver con <strong>length</strong>, pues Go no iba a ser menos tenemos nuestro len:</p>\n<pre><code>rangers3 := []string{&quot;Ranger Rosa&quot;, &quot;Ranger Amarillo&quot;}\n\nfmt.Println(len(rangers3))\n</code></pre>\n<p>Esto nos devuelve un 2, cosa normal no?? Pero como tal antes hemos hablado de la <strong>capacidad</strong> también, en este caso Go tiene también una forma de ver la capacidad que tenemos reservada(básicamente es reserva en memoria)</p>\n<pre><code>rangers3 := []string{&quot;Ranger Rosa&quot;, &quot;Ranger Amarillo&quot;}\n\nfmt.Println(&quot;Tamaño&quot;,len(rangers3))\nfmt.Println(&quot;Capacidad&quot;,cap(rangers3))\n</code></pre>\n<p>Esto nos devolveria:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.31.12.png\" alt=\"\"></p>\n<p>Hasta aqui todo normal no?? Todo tiene sentido verdad?? Vale ahora vamos a añadirle algo para aumentarlo, recordemos que con <strong>capacidad 2</strong> no podemos usar asignación directa para los siguientes elementos como tal tenemos que usar <strong>append</strong>, vamos a usar <strong>append</strong> y veamos que nos devuelve ahora:</p>\n<pre><code>rangers3 := []string{&quot;Ranger Rosa&quot;, &quot;Ranger Amarillo&quot;}\n\nrangers3 = append(rangers3, &quot;Ranger Blanco&quot;)\n\nfmt.Println(&quot;Tamaño&quot;, len(rangers3))\nfmt.Println(&quot;Capacidad&quot;, cap(rangers3))\n</code></pre>\n<p>Para nuestra sorpresa al ejecutar vemos esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.34.02.png\" alt=\"\"><br>\n<strong>UPS!!!</strong> <em>y que ha pasaaaaaooooo!!!????</em>, es simple Go lo que hace es duplicar la capacidad anterior, por lo que si no tenemos en cuenta y tratamos con slices muy grandes, por ejemplo imaginemos un array de 100 elementos, si añadimos 1 mas para hacer 101 tendriamos una capacidad de 200 siendo realmente inecesario.<br>\nVeamoslo con un ejemplo añadiendo al código anterior los 2 rangers restantes:</p>\n<pre><code>rangers3 := []string{&quot;Ranger Rosa&quot;, &quot;Ranger Amarillo&quot;}\n\nrangers3 = append(rangers3, &quot;Ranger Blanco&quot;)\n\nfmt.Println(&quot;Tamaño&quot;, len(rangers3))\nfmt.Println(&quot;Capacidad&quot;, cap(rangers3))\n\nrangers3 = append(rangers3, &quot;Ranger Rojo&quot;, &quot;Ranger Negro&quot;)\n\nfmt.Println(&quot;Tamaño&quot;, len(rangers3))\nfmt.Println(&quot;Capacidad&quot;, cap(rangers3))\n</code></pre>\n<p>Vemos que tenemos de repente una capacidad de 8:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.39.27.png\" alt=\"\"></p>\n<p>Creo que con esto mas o menos queda clara la diferencia entre los arrays definidos y los slices, hablando de consumo de memoria y del propio uso de uno u otro, siempre sera recomendable tener arrays definidos, veremos más adelante alguna forma de pasar de uno a otro.</p>\n<p>En el próximo post veremos tambien como trabajar con ambos, para recorrerlos, por ejemplo, y varias cosas mas.</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/go-go-power-ra-ah-que-no-go-parte-3-arrays-y-slices-i/","canonical_url":null,"uuid":"35e1d966-d22e-4a90-8c8c-8c46b92de7e1","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"24","reading_time":7,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>En Go tenemos dos tipos de <strong>arrays</strong> o <strong>arreglos</strong>:</p>\n<ul>\n<li>\n<p>Los que llaman <strong>arrays</strong>, son arreglos con una cantidad definida de elementos,es decir, tienen un tamaño fijo y no pueden crecer.</p>\n</li>\n<li>\n<p>Los llamados <strong>slices</strong>, que son los arreglos o arrays más comunes, en los cuales podemos añadir los elementos que queramos.</p>\n</li>\n</ul>\n<p>Y porque tenemos dos tipos? Pues básicamente es por el consumo de recursos, los <strong>arrays definidos</strong>, solo se reservan los recursos que necesitan, los <strong>slices</strong> o llamemoslos <strong>arrays dinámicos</strong> tienen siempre reservado una cantidad mayor de recursos para poder crecer. Más abajo veremos como saber esta cantidad.</p>\n<h2 id=\"arraysdefinidos\">Arrays definidos</h2>\n<p>La forma de declararlos es bastante sencilla:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">//supongamos que son 3\nvar rangers [3]string\nrangers[0] = \"Ranger Rojo\"\nrangers[1] = \"Ranger Negro\"\nrangers[2] = \"Ranger Amarillo\"\n\n//El uso es como todos los arrays\nfmt.Println(rangers)\nfmt.Println(rangers[0])\nfmt.Println(rangers[1])\nfmt.Println(rangers[2])\n</code></pre></div>\n<p>Si ejecutamos esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen0814.png\" alt=\"\"></p>\n<p>Hasta aqui todo parece normal, vamos a intentar añadir alguno mas:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangers[3] = \"Ranger Verde\"\n</code></pre></div>\n<p>Vemos como el propio visual studio nos avisa:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen0831.png\" alt=\"\"><br>\nLa única forma que tendriamos de ampliar ese array, o más bien de trabajar con los datos que contiene, es hacer una copia del array en otro con más cantidad de elementos posibles(o que fuera un <strong>slice</strong>).</p>\n<p>Más abajo veremos como hacer eso, ya que es común para ambos tipos de array.</p>\n<h2 id=\"slices\">SLICES</h2>\n<p>Continuemos con los <strong>slices</strong>, que serán posiblemente el tipo más usado, sobretodo al principio.<br>\nTenemos varias formas de crear <strong>slices</strong>, cada una tiene sus peculiaridades.<br>\nLa primera:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">var rangers []string\n\nrangers[0] = \"Ranger Rosa\"\nfmt.Println(rangers)\n</code></pre></div>\n<p>En un principio todo parece normal, el compilador no se queja tampoco, <em>cool</em>, pero vamos a ejecutarlo:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen08.45.05.png\" alt=\"\"><br>\nComo veis tenemos un bonito <span style=\"color:red\">Panic</span> (para el que no se lo imagine es como muestra los errores) pero ¿porque?</p>\n<p>Go al inicializar los <strong>slices</strong> si lo hacemos de esa forma los inicializa por defecto <strong>\"vacios\"</strong> pero no entendamos vacios como cualquier otro elemento que podemos asignarle un valor directamente, si no lo inicializa con <strong>\"ausencia de todo\"</strong> incluso de tamaño.<br>\nPero esto no significa que no podamos usarlo, Go tiene un método <strong>append</strong> que nos permite añadir los elementos que necesitemos:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangers = append(rangers, \"Ranger Rosa\", \"Ranger Rojo\")\n\nfmt.Println(rangers)\n</code></pre></div>\n<p>Podriamos añadir todos los que queramos, y como vemos funciona perfectamente:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen08.57.07.png\" alt=\"\"></p>\n<p>Antes de continuar con la siguiente forma de inicializar <strong>slices</strong> vamos a hablar de <strong>\"Tamaño\"</strong> y <strong>\"Capacidad\"</strong></p>\n<p>¿¿??</p>\n<p>Si jejejeje, con los slices en aplicaciones complejas tendremos que tener en cuenta estas dos cosas, pensando en la optimización por supuesto.</p>\n<ul>\n<li>\n<p><strong>Tamaño</strong>: Básicamente es el tamaño que tiene ocupado el slice, lo que en otros lenguajes consultaríamos con un <strong>array.length</strong></p>\n</li>\n<li>\n<p><strong>Capacidad</strong>: Es la cantidad de recursos reservada para ese <strong>slice</strong>.</p>\n</li>\n</ul>\n<p>Es decir si pensamos en los slices como cajas, tenemos que un slice con una capacidad de 5 son 5 cajas, de las cuales 2 estan cerradas con algo dentro(tamaño 2) y otras 3 estan abiertas a la espera de tener algo dentro, pero estan ocupando su espacio en el suelo ya.</p>\n<p>Ahora veamos la segunda forma de crear un <strong>slice</strong>:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangers := make([]string,10)\n//Aqui tendriamos un slice con 10 de tamaño y 10 de capacidad\n\nrangers := make([]string,5,10)\n//Y aqui tendriamos un slice con 5 de tamaño y 10 de capacidad\n</code></pre></div>\n<p>Veamos un ejemplo de código para ilustrar un poco mejor esto:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">var rangers []string\nfmt.Println(\"Sin inicializar, es decir tamaño 0\")\nfmt.Println(rangers)\n\nrangers = append(rangers, \"Ranger Rosa\", \"Ranger Rojo\")\n\nfmt.Println(\"Append al no inicializado\")\nfmt.Println(rangers)\n\nrangers2 := make([]string, 10)\n\nfmt.Println(\"Usando make para asignar tamaño y capacidad iguales\")\nfmt.Println(rangers2)\n\nrangers3 := make([]string, 5, 10)\n\nfmt.Println(\"Usando make para asignar tamaño y capacidad distintos\")\nfmt.Println(rangers3)\n</code></pre></div>\n<p>Si ejecutamos este código tendriamos un resultado como este:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen09.30.55.png\" alt=\"\"><br>\nSi os fijais tenemos bastantes diferencias en cuanto a la inicialización por defecto de cada uno de los slices, el <strong>primero</strong> realmente tendria un valor similar a <strong>null</strong>, en el <strong>segundo</strong> hemos inicializado ese null con dos elementos, en el <strong>tercero</strong> se ha aplicado la inicialización por defecto de go de strings(es decir \"\") sobre 10 elementos, en el <strong>ultimo</strong> esa misma inicialización sobre 5.</p>\n<p>Ahora ya podemos usar lo que llamariamos asignación directa:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangers2[2] = \"Ranger Verde\"\nrangers3[3] = \"Ranger Negro\"\n\nfmt.Println(rangers2)\nfmt.Println(rangers3)\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen20.56.57.png\" alt=\"\"></p>\n<p>Bien hemos comprobado que podemos añadir ahora por lo menos dentro del \"tamaño inicializado\", si nos fijamos cada elemento tiene una posición definida dentro del slice. Veamos ahora lo que pasa si intentamos añadir en una ubicación por encima del <strong>tamaño</strong>(ojo no de la capacidad). Lo vamos a intentar on <strong>ranger3</strong> que tiene una capacidad de 10 y un tamaño de 5:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.00.34.png\" alt=\"\"></p>\n<p>Vemos como nos vuelve a dar el error de que nos hemos salido del rango permitido. Para añadir por encima de esto tenemos que usar el mismo método que antes con <strong>append</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangers3 = append(rangers3, \"Ranger Rosa\", \"Ranger Rojo\")\nfmt.Println(rangers3)\n</code></pre></div>\n<p>Si ahora ejecutamos veremos como despues del espacio que teniamos antes ha añadido los dos rangers nuevos.<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.06.25.png\" alt=\"\"><br>\n<strong>OJO a lo de los espacios</strong> vamos a ver una ultima forma de inicializar <strong>Arrays</strong> y <strong>Slices</strong> y volveremos a este ejemplo para ver cosas sobre la <strong>capacidad</strong> y el <strong>tamaño</strong>.</p>\n<p>Como última forma vamos a ver la inicialización directa de ambos casos:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">//Array definido\nrangers2 := [2]string{\"Ranger Verde\", \"Ranger Blanco\"}\n//Slice\nrangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\t\nfmt.Println(rangers2)\t\nfmt.Println(rangers3)\n</code></pre></div>\n<p>Como tal no notamos ninguna diferencia a la hora de mostrarlos:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.17.55.png\" alt=\"\"></p>\n<p><strong>Atención</strong> si hacemos esto:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangers2 := [3]string{\"Ranger Verde\", \"Ranger Blanco\"}\n</code></pre></div>\n<p>Nos añade,en este caso un string(podria ser cualquier tipo que hubieramos indicado) vacio en el elemento faltante.</p>\n<p>Bien ahora vamos a probar a añadir:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangers2 := [2]string{\"Ranger Verde\", \"Ranger Blanco\"}\nrangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nrangers2 = append(rangers2, \"Ranger Negro\")\nrangers3 = append(rangers3, \"Ranger Blanco\")\n</code></pre></div>\n<p>Si vemos el <strong>array definido</strong> se queja:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.20.36.png\" alt=\"\"></p>\n<p>Como tal sigue restringiendo su ampliación, lo contrario que el <strong>slice</strong>.<br>\nAhora vamos a ver la diferencia real entre uno y otro.</p>\n<h2 id=\"lenycap\">Len y Cap</h2>\n<p>Go tiene como casi todos los lenguajes una forma de comprobar la cantidad de elementos que tiene un array,normalmente suele tener que ver con <strong>length</strong>, pues Go no iba a ser menos tenemos nuestro len:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nfmt.Println(len(rangers3))\n</code></pre></div>\n<p>Esto nos devuelve un 2, cosa normal no?? Pero como tal antes hemos hablado de la <strong>capacidad</strong> también, en este caso Go tiene también una forma de ver la capacidad que tenemos reservada(básicamente es reserva en memoria)</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nfmt.Println(\"Tamaño\",len(rangers3))\nfmt.Println(\"Capacidad\",cap(rangers3))\n</code></pre></div>\n<p>Esto nos devolveria:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.31.12.png\" alt=\"\"></p>\n<p>Hasta aqui todo normal no?? Todo tiene sentido verdad?? Vale ahora vamos a añadirle algo para aumentarlo, recordemos que con <strong>capacidad 2</strong> no podemos usar asignación directa para los siguientes elementos como tal tenemos que usar <strong>append</strong>, vamos a usar <strong>append</strong> y veamos que nos devuelve ahora:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nrangers3 = append(rangers3, \"Ranger Blanco\")\n\nfmt.Println(\"Tamaño\", len(rangers3))\nfmt.Println(\"Capacidad\", cap(rangers3))\n</code></pre></div>\n<p>Para nuestra sorpresa al ejecutar vemos esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.34.02.png\" alt=\"\"><br>\n<strong>UPS!!!</strong> <em>y que ha pasaaaaaooooo!!!????</em>, es simple Go lo que hace es duplicar la capacidad anterior, por lo que si no tenemos en cuenta y tratamos con slices muy grandes, por ejemplo imaginemos un array de 100 elementos, si añadimos 1 mas para hacer 101 tendriamos una capacidad de 200 siendo realmente inecesario.<br>\nVeamoslo con un ejemplo añadiendo al código anterior los 2 rangers restantes:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nrangers3 = append(rangers3, \"Ranger Blanco\")\n\nfmt.Println(\"Tamaño\", len(rangers3))\nfmt.Println(\"Capacidad\", cap(rangers3))\n\nrangers3 = append(rangers3, \"Ranger Rojo\", \"Ranger Negro\")\n\nfmt.Println(\"Tamaño\", len(rangers3))\nfmt.Println(\"Capacidad\", cap(rangers3))\n</code></pre></div>\n<p>Vemos que tenemos de repente una capacidad de 8:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.39.27.png\" alt=\"\"></p>\n<p>Creo que con esto mas o menos queda clara la diferencia entre los arrays definidos y los slices, hablando de consumo de memoria y del propio uso de uno u otro, siempre sera recomendable tener arrays definidos, veremos más adelante alguna forma de pasar de uno a otro.</p>\n<p>En el próximo post veremos tambien como trabajar con ambos, para recorrerlos, por ejemplo, y varias cosas mas.</p>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En Go tenemos dos tipos de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"arrays"}]},{"type":"text","value":" o "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"arreglos"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Los que llaman "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"arrays"}]},{"type":"text","value":", son arreglos con una cantidad definida de elementos,es decir, tienen un tamaño fijo y no pueden crecer."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Los llamados "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"slices"}]},{"type":"text","value":", que son los arreglos o arrays más comunes, en los cuales podemos añadir los elementos que queramos."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y porque tenemos dos tipos? Pues básicamente es por el consumo de recursos, los "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"arrays definidos"}]},{"type":"text","value":", solo se reservan los recursos que necesitan, los "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"slices"}]},{"type":"text","value":" o llamemoslos "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"arrays dinámicos"}]},{"type":"text","value":" tienen siempre reservado una cantidad mayor de recursos para poder crecer. Más abajo veremos como saber esta cantidad."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"arraysdefinidos"},"children":[{"type":"text","value":"Arrays definidos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"La forma de declararlos es bastante sencilla:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//supongamos que son 3\nvar rangers [3]string\nrangers[0] = \"Ranger Rojo\"\nrangers[1] = \"Ranger Negro\"\nrangers[2] = \"Ranger Amarillo\"\n\n//El uso es como todos los arrays\nfmt.Println(rangers)\nfmt.Println(rangers[0])\nfmt.Println(rangers[1])\nfmt.Println(rangers[2])\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si ejecutamos esto:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen0814.png","alt":""},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hasta aqui todo parece normal, vamos a intentar añadir alguno mas:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangers[3] = \"Ranger Verde\"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vemos como el propio visual studio nos avisa:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen0831.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nLa única forma que tendriamos de ampliar ese array, o más bien de trabajar con los datos que contiene, es hacer una copia del array en otro con más cantidad de elementos posibles(o que fuera un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"slice"}]},{"type":"text","value":")."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Más abajo veremos como hacer eso, ya que es común para ambos tipos de array."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"slices"},"children":[{"type":"text","value":"SLICES"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Continuemos con los "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"slices"}]},{"type":"text","value":", que serán posiblemente el tipo más usado, sobretodo al principio."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nTenemos varias formas de crear "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"slices"}]},{"type":"text","value":", cada una tiene sus peculiaridades."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nLa primera:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"var rangers []string\n\nrangers[0] = \"Ranger Rosa\"\nfmt.Println(rangers)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En un principio todo parece normal, el compilador no se queja tampoco, "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"cool"}]},{"type":"text","value":", pero vamos a ejecutarlo:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen08.45.05.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nComo veis tenemos un bonito "},{"type":"element","tagName":"span","properties":{"style":"color:red"},"children":[{"type":"text","value":"Panic"}]},{"type":"text","value":" (para el que no se lo imagine es como muestra los errores) pero ¿porque?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Go al inicializar los "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"slices"}]},{"type":"text","value":" si lo hacemos de esa forma los inicializa por defecto "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"\"vacios\""}]},{"type":"text","value":" pero no entendamos vacios como cualquier otro elemento que podemos asignarle un valor directamente, si no lo inicializa con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"\"ausencia de todo\""}]},{"type":"text","value":" incluso de tamaño."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nPero esto no significa que no podamos usarlo, Go tiene un método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"append"}]},{"type":"text","value":" que nos permite añadir los elementos que necesitemos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangers = append(rangers, \"Ranger Rosa\", \"Ranger Rojo\")\n\nfmt.Println(rangers)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Podriamos añadir todos los que queramos, y como vemos funciona perfectamente:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen08.57.07.png","alt":""},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Antes de continuar con la siguiente forma de inicializar "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"slices"}]},{"type":"text","value":" vamos a hablar de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"\"Tamaño\""}]},{"type":"text","value":" y "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"\"Capacidad\""}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"¿¿??"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si jejejeje, con los slices en aplicaciones complejas tendremos que tener en cuenta estas dos cosas, pensando en la optimización por supuesto."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Tamaño"}]},{"type":"text","value":": Básicamente es el tamaño que tiene ocupado el slice, lo que en otros lenguajes consultaríamos con un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"array.length"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Capacidad"}]},{"type":"text","value":": Es la cantidad de recursos reservada para ese "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"slice"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Es decir si pensamos en los slices como cajas, tenemos que un slice con una capacidad de 5 son 5 cajas, de las cuales 2 estan cerradas con algo dentro(tamaño 2) y otras 3 estan abiertas a la espera de tener algo dentro, pero estan ocupando su espacio en el suelo ya."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora veamos la segunda forma de crear un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"slice"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangers := make([]string,10)\n//Aqui tendriamos un slice con 10 de tamaño y 10 de capacidad\n\nrangers := make([]string,5,10)\n//Y aqui tendriamos un slice con 5 de tamaño y 10 de capacidad\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos un ejemplo de código para ilustrar un poco mejor esto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"var rangers []string\nfmt.Println(\"Sin inicializar, es decir tamaño 0\")\nfmt.Println(rangers)\n\nrangers = append(rangers, \"Ranger Rosa\", \"Ranger Rojo\")\n\nfmt.Println(\"Append al no inicializado\")\nfmt.Println(rangers)\n\nrangers2 := make([]string, 10)\n\nfmt.Println(\"Usando make para asignar tamaño y capacidad iguales\")\nfmt.Println(rangers2)\n\nrangers3 := make([]string, 5, 10)\n\nfmt.Println(\"Usando make para asignar tamaño y capacidad distintos\")\nfmt.Println(rangers3)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si ejecutamos este código tendriamos un resultado como este:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen09.30.55.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nSi os fijais tenemos bastantes diferencias en cuanto a la inicialización por defecto de cada uno de los slices, el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"primero"}]},{"type":"text","value":" realmente tendria un valor similar a "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"null"}]},{"type":"text","value":", en el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"segundo"}]},{"type":"text","value":" hemos inicializado ese null con dos elementos, en el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tercero"}]},{"type":"text","value":" se ha aplicado la inicialización por defecto de go de strings(es decir \"\") sobre 10 elementos, en el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ultimo"}]},{"type":"text","value":" esa misma inicialización sobre 5."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora ya podemos usar lo que llamariamos asignación directa:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangers2[2] = \"Ranger Verde\"\nrangers3[3] = \"Ranger Negro\"\n\nfmt.Println(rangers2)\nfmt.Println(rangers3)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen20.56.57.png","alt":""},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bien hemos comprobado que podemos añadir ahora por lo menos dentro del \"tamaño inicializado\", si nos fijamos cada elemento tiene una posición definida dentro del slice. Veamos ahora lo que pasa si intentamos añadir en una ubicación por encima del "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tamaño"}]},{"type":"text","value":"(ojo no de la capacidad). Lo vamos a intentar on "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ranger3"}]},{"type":"text","value":" que tiene una capacidad de 10 y un tamaño de 5:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.00.34.png","alt":""},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vemos como nos vuelve a dar el error de que nos hemos salido del rango permitido. Para añadir por encima de esto tenemos que usar el mismo método que antes con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"append"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangers3 = append(rangers3, \"Ranger Rosa\", \"Ranger Rojo\")\nfmt.Println(rangers3)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si ahora ejecutamos veremos como despues del espacio que teniamos antes ha añadido los dos rangers nuevos."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.06.25.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"OJO a lo de los espacios"}]},{"type":"text","value":" vamos a ver una ultima forma de inicializar "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Arrays"}]},{"type":"text","value":" y "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Slices"}]},{"type":"text","value":" y volveremos a este ejemplo para ver cosas sobre la "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"capacidad"}]},{"type":"text","value":" y el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tamaño"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como última forma vamos a ver la inicialización directa de ambos casos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//Array definido\nrangers2 := [2]string{\"Ranger Verde\", \"Ranger Blanco\"}\n//Slice\nrangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\t\nfmt.Println(rangers2)\t\nfmt.Println(rangers3)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como tal no notamos ninguna diferencia a la hora de mostrarlos:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.17.55.png","alt":""},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Atención"}]},{"type":"text","value":" si hacemos esto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangers2 := [3]string{\"Ranger Verde\", \"Ranger Blanco\"}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nos añade,en este caso un string(podria ser cualquier tipo que hubieramos indicado) vacio en el elemento faltante."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bien ahora vamos a probar a añadir:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangers2 := [2]string{\"Ranger Verde\", \"Ranger Blanco\"}\nrangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nrangers2 = append(rangers2, \"Ranger Negro\")\nrangers3 = append(rangers3, \"Ranger Blanco\")\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si vemos el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"array definido"}]},{"type":"text","value":" se queja:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.20.36.png","alt":""},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como tal sigue restringiendo su ampliación, lo contrario que el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"slice"}]},{"type":"text","value":"."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nAhora vamos a ver la diferencia real entre uno y otro."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"lenycap"},"children":[{"type":"text","value":"Len y Cap"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Go tiene como casi todos los lenguajes una forma de comprobar la cantidad de elementos que tiene un array,normalmente suele tener que ver con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"length"}]},{"type":"text","value":", pues Go no iba a ser menos tenemos nuestro len:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nfmt.Println(len(rangers3))\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto nos devuelve un 2, cosa normal no?? Pero como tal antes hemos hablado de la "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"capacidad"}]},{"type":"text","value":" también, en este caso Go tiene también una forma de ver la capacidad que tenemos reservada(básicamente es reserva en memoria)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nfmt.Println(\"Tamaño\",len(rangers3))\nfmt.Println(\"Capacidad\",cap(rangers3))\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto nos devolveria:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.31.12.png","alt":""},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hasta aqui todo normal no?? Todo tiene sentido verdad?? Vale ahora vamos a añadirle algo para aumentarlo, recordemos que con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"capacidad 2"}]},{"type":"text","value":" no podemos usar asignación directa para los siguientes elementos como tal tenemos que usar "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"append"}]},{"type":"text","value":", vamos a usar "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"append"}]},{"type":"text","value":" y veamos que nos devuelve ahora:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nrangers3 = append(rangers3, \"Ranger Blanco\")\n\nfmt.Println(\"Tamaño\", len(rangers3))\nfmt.Println(\"Capacidad\", cap(rangers3))\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para nuestra sorpresa al ejecutar vemos esto:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.34.02.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"UPS!!!"}]},{"type":"text","value":" "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"y que ha pasaaaaaooooo!!!????"}]},{"type":"text","value":", es simple Go lo que hace es duplicar la capacidad anterior, por lo que si no tenemos en cuenta y tratamos con slices muy grandes, por ejemplo imaginemos un array de 100 elementos, si añadimos 1 mas para hacer 101 tendriamos una capacidad de 200 siendo realmente inecesario."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nVeamoslo con un ejemplo añadiendo al código anterior los 2 rangers restantes:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangers3 := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nrangers3 = append(rangers3, \"Ranger Blanco\")\n\nfmt.Println(\"Tamaño\", len(rangers3))\nfmt.Println(\"Capacidad\", cap(rangers3))\n\nrangers3 = append(rangers3, \"Ranger Rojo\", \"Ranger Negro\")\n\nfmt.Println(\"Tamaño\", len(rangers3))\nfmt.Println(\"Capacidad\", cap(rangers3))\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vemos que tenemos de repente una capacidad de 8:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen21.39.27.png","alt":""},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Creo que con esto mas o menos queda clara la diferencia entre los arrays definidos y los slices, hablando de consumo de memoria y del propio uso de uno u otro, siempre sera recomendable tener arrays definidos, veremos más adelante alguna forma de pasar de uno a otro."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En el próximo post veremos tambien como trabajar con ambos, para recorrerlos, por ejemplo, y varias cosas mas."}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"arraysdefinidos","heading":"Arrays definidos"},{"id":"slices","heading":"SLICES"},{"id":"lenycap","heading":"Len y Cap"}]},"featureImageSharp":{"base":"Untitled-2.png","publicURL":"/static/4c2a69b59a578389653f7d3cb966f439/Untitled-2.png","imageMeta":{"width":649,"height":244},"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABr0lEQVQoz22RPWhTURiGP+29N/eec3/aK1FjI9RBm3aSSBVBDVSzOGpwiMEhKopmsCnYyUVQwS5WxKU6iGBwdOrQqZOD+EO1HYo/mCBtySSC6+O5CQVjHF7ecw7veb6Xc0RrTa8USnV9S57ZZ2LF3rTqeBwqhiIf3++X9AO3YN11AlfGx7KKyTGX4nhXx/YJg9pGZBuOYxs5WJbVC1QdQBfm6oAwCnl+wWFixDMXPbZbGjulicx58dQko6MHKBQK5HK5jvL5/D8NDcz3NQOO4khGaJSElxXh4knFiaMZTh/22b/HwbYdpms1zpVKTNXrlMtlKpUK1Wq1v2ECVdrHPVPi+N0pns2eZ/7FNFdeP+FVY4a5xzfZcf8BA9fr7B4eZjCKSKfTZLNZ4jj+D9B1CXbuQu495OzaBt/ffWJh5RvF5m9azTbrq2tMfN1E5uZRQYhn8q7nkUql8Iz3ApN2QUAggly6xsjndRY32zz68J6Dtcs8ffuG280NrC9trOpVfJPTYdjzoX1vmEzVJmjfmEFaP5HlJoeWllhuzFJYXEA+tpAfv7Bu3enkkrz6i/EHdxf7UmCHE+cAAAAASUVORK5CYII=","aspectRatio":2.6515151515151514,"src":"/static/4c2a69b59a578389653f7d3cb966f439/d382d/Untitled-2.png","srcSet":"/static/4c2a69b59a578389653f7d3cb966f439/847ef/Untitled-2.png 175w,\n/static/4c2a69b59a578389653f7d3cb966f439/91cba/Untitled-2.png 350w,\n/static/4c2a69b59a578389653f7d3cb966f439/d382d/Untitled-2.png 649w","srcWebp":"/static/4c2a69b59a578389653f7d3cb966f439/10386/Untitled-2.webp","srcSetWebp":"/static/4c2a69b59a578389653f7d3cb966f439/9fca7/Untitled-2.webp 175w,\n/static/4c2a69b59a578389653f7d3cb966f439/37a4e/Untitled-2.webp 350w,\n/static/4c2a69b59a578389653f7d3cb966f439/10386/Untitled-2.webp 649w","sizes":"(max-width: 649px) 100vw, 649px"}}}},"next":{"id":"Ghost__Post__5a338158333e0f134c248f06","title":"Go Go Power Ra....ah que no: Go Parte1 - Intro y preparacion","slug":"go-go-power-ra-ah-que-no-go-parte1-intro-y-preparacion","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Untitled.png","excerpt":"Empiezo con una nueva sección, mi aventura con el lenguaje GO, el cual he\ndescubierto que me encanta, es un lenguaje muy bueno y sencillo para tratar con\ntemas de concurrencia y realmente hace un montón de cosas por si solo(como su\npaquete net que hace la vida mas fácil en cuanto a servidor Web se refiere), lo\nvamos a ir viendo poco a poco. Sin mucho más empecemos\n\nInstalación\nEl lenguaje lo podemos escribir desde cualquier editor de texto pero es\nnecesario instalar el compilador y realizar algu","custom_excerpt":null,"visibility":"public","created_at_pretty":"1 May 2017","published_at_pretty":"3 Jun 2017","updated_at_pretty":"11 Oct 2017","created_at":"2017-05-01T12:36:05.000+02:00","published_at":"2017-06-03T11:45:14.000+02:00","updated_at":"2017-10-11T13:44:00.000+02:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":null}],"primary_author":{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":{"base":"Perfil.jpg","publicURL":"/static/b0de6281fb28a266510b3b09b9243e5a/Perfil.jpg","imageMeta":{"width":307,"height":307},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGzw6zC6zHn+cLYP//EAB0QAAICAQUAAAAAAAAAAAAAAAEDAAIEEyEiIzL/2gAIAQEAAQUCifca8KgcKWVfUpkHsG5pxX//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARARcQISIUFR/9oACAEBAAY/AhU88xkb7N06a8P/xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMUFRYXH/2gAIAQEAAT8hR2pq40aqb+xIAeXibhW9JXr8joF4TBcSNe0//9oADAMBAAIAAwAAABDzDwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFhcfD/2gAIAQEAAT8QyItrELaTlatLwU63MvEW6vUNdy4LZQDn7iVApV9VLtANdWwKkuYq4Er1VZ//2Q==","aspectRatio":1,"src":"/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg","srcSet":"/static/b0de6281fb28a266510b3b09b9243e5a/f340b/Perfil.jpg 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/22d64/Perfil.jpg 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/aa249/Perfil.jpg 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/0dc33/Perfil.jpg 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/60667/Perfil.jpg 307w","srcWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp","srcSetWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/59cda/Perfil.webp 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/7da75/Perfil.webp 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f282e/Perfil.webp 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/a7b21/Perfil.webp 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f59af/Perfil.webp 307w","sizes":"(max-width: 110px) 100vw, 110px"}}}},"primary_tag":{"slug":"go","url":"https://jlgarcia.fulldev.ninja/tag/go/","name":"Go","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null},"tags":[{"slug":"go","url":"https://jlgarcia.fulldev.ninja/tag/go/","name":"Go","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null},{"slug":"golang","url":"https://jlgarcia.fulldev.ninja/tag/golang/","name":"Golang","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null}],"plaintext":"Empiezo con una nueva sección, mi aventura con el lenguaje GO, el cual he\ndescubierto que me encanta, es un lenguaje muy bueno y sencillo para tratar con\ntemas de concurrencia y realmente hace un montón de cosas por si solo(como su\npaquete net que hace la vida mas fácil en cuanto a servidor Web se refiere), lo\nvamos a ir viendo poco a poco. Sin mucho más empecemos\n\nInstalación\nEl lenguaje lo podemos escribir desde cualquier editor de texto pero es\nnecesario instalar el compilador y realizar algunas configuraciones. Desde la\npropia página Go Download [https://golang.org/dl/] están los paquetes, y las\ninstrucciones. También es posible instalarlo con Homebrew (si lo usamos).\n\nbrew install golang\n\n\nPara la correcta instalación tenemos que tener en cuenta que es necesario\nconfigurar ciertas variables de entorno, teneis toda la información en:\nInstalación GO [https://golang.org/doc/install]\n\nHaceros a la idea de que la documentación de Go es bastante completa por lo que\nen general encontraremos todo lo que necesitemos aquí:\nDocumentación GO [https://golang.org/doc/]\n\nSolo como aclaración tener en cuenta lo que comenta la documentación sobre los\nvariables de entorno, si ejecutamos algún intalador (MAC/Windows) no deberíamos\ntener que hacer nada, si algo no funciona comprobar que existe en la variable de\nentorno $PATH la referencia a Go y que es correcta:\n\nWindows\nc:\\Go\\bin\nMac\necho $PATH <- nos devuelve lo que tenemos ahora mismo en el path\nEsto deberia devolvernos una cadena de texto muy larga que en algún punto deberia poner algo similar a esto\n/usr/local/go/bin\n\n\nSi lo hacemos en Linux o con cualquier source, lo mejor es extraer el contenido\nen las rutas recomendadas y configurar las variables de entorno como aparece en\nla documentación.\n\nSi tenéis algún problema buscar en internet que hay mucha información sobre\nesto, aun así si continuáis con problemas ponerlo en los comentarios e\nintentamos resolverlo.\n\nAntes de continuar un detalle de algunas carpetas del directorio de Go, por si\nquereis buscar algo:\n\nbin <- binarios,  los que instalamos con go install\npackage o pkg <- Trabajar con los wrappers dentro de nuestro código. Encapsuladores de C.\nsrc <- Todo nuestro código fuente y la librerías de terceros. Las puede descargar go al realizar los imports en nuestras clases, o las podemos poner nosotros. Aqui es donde suele buscar el origen de los imports.\n\n\nAlgunos detalles sobre GO\nGo es un lenguaje compilado no interpretado, es decir, el código es compilado\n(transformado) a lenguaje máquina con lo que se genera un ejecutable que\nfuncionará sin necesidad de nada más para la arquitectura para la que fue\ncreado. Si hablamos de los errores, en este tipo de lenguajes deberíamos verlos\nen el proceso de compilación, pero veremos como con GO podemos probar nuestro\ncódigo sin necesidad de compilar.\n\nUn lenguaje interpretado es aquel en el que un tercero(normalmente llamado\nintérprete) lee nuestro código y lo traduce a código máquina, esto sucede cada\nvez que lo ejecutamos, y los errores los detectamos en este tiempo de ejecución.\n\nGo es un lenguaje que se usa mucho para scripting en backend ya que es bastante\nrápido en ejecutar, sus librerías básicas cubren mogollón de escenarios y como\nhe comentado el mismo script lo podriamos compilar para todos los S.O, aunque\nesto depende un poco de lo que haga jejejeje, no es tan mágico como suena.\nPersonalmente me encanta por la parte de concurrencia y la parte de Web Server,\nque si mezclamos ambas cosas podemos hacer cosas muy curiosas y que consuman\npocos recursos.\nComo ejemplo pongo un caso de uso de la empresa Malwarebytes\n[https://es.malwarebytes.com/] en el que gestionan 1 Millón que bajaron sus\nconsumos en un porcentaje muy alto usando GO link\n[http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/].\nNo se a vosotros pero a mi me parece muy interesante poder hacer cosas como esa.\n\nEs un lenguaje con tipado estático, esto quiere decir que desde el principio al\ndeclarar las variables tenemos que indicarle el tipo que son. Aunque es cierto\nque GO tiene una forma de declaración y asignación de variables, en la que el\nlenguaje hace lo que se conoce como \"inferencia de tipos\", o lo que es lo mismo,\nel propio lenguaje define el tipo de la variable según el valor asignado(veremos\nmas adelante ambas formas)\n\nPor último comentar que es un lenguaje que tiene características similares a C\n(como puede ser que usa punteros), compila directamente en ensamblador y un\nextra que es muy útil y que nos ahorra quebraderos de cabeza es que tiene \nrecolector de basura es decir, no tenemos que controlar el estado de las\nvariables o funciones para saber si se estan usando o no, ya lo hace Go por\nnosotros y aunque afecta un poco al rendimiento (realmente es muy poquito), es\nde agradecer a la hora de programar\n\nHola Mundo\nComo ya he escrito bastante rollo, vamos a trabajar un pelín con go.\nAntes de empezar primero comprobamos que tenemos bien instalado Go, para ello\ndesde cualquier linea de comandos (da igual Windows/Mac/Linux) escribimos:\n\ngo version\n\n\nY deberíamos ver algo como esto:\n\nSi lo vemos todo va bien, si a alguien no le aparece o tiene problemas que lo\nvaya poniendo en los comentarios y vemos como lo solucionamos.\n\nAhora abrimos un fichero de texto escribimos siguiente y guardamos como main.go:\n\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n   fmt.Println(\"Hello Power Rangers\")\n}\n\n\nCon el fichero guardado, nos situamos en la ruta donde lo tengamos en nuestra\nlinea de comandos y ejecutamos:\n\ngo run main.go\n\n\nEsto nos deberia mostrar algo similar a esto en la consola:\n\nVoilá ya tenemos nuestro hola mundo. Ya iremos viendo lo que es cada cosa que\nhemos escrito, esto es solo para que escribamos un poco y veamos que funciona.\n\nIDEs\nLo último que vamos a ver en este post, serán los IDE, que yo no se vosotros,\npero a mi el modo Chuck Norris para programar (hacerlo directamente en un\nfichero de texto) no es lo que mas me convence, si tenemos posibilidades de que\nnos ayuden un pelín de alguna forma yo lo agradezco, pero como ya he comentado\nse puede hacer con cualquier editor de texto.\n\nPara programar con Go tenemos varias opciones:\n\n * Podemos hacerlo en un fichero de texto(Chuck Norris/Bruce Lee/Yoda mode) como\n   ya he comentado\n * Otra opción es usar Sublime Text una gran mayoria de vosotros ya lo\n   conocereis, y como siempre pues tenemos plugins que la comunidad ha creado \n   Ejemplo [https://github.com/DisposaBoy/GoSublime] lo que le daria algunas\n   vitaminas a nuestro editor para trabajar con Go.\n * Tambien es posible usar Atom. Sigue la misma teoría que Sublime, tenemos\n   plugins que nos ayudan con Go Ejemplo [https://atom.io/packages/go-plus]\n * Los grandes de JetBrains [https://www.jetbrains.com/] están preparando un IDE\n   muy completo (como siempre previo pago), y ahora tenemos disponibles algunos\n   plugins para algunos de sus IDEs actuales.\n * Para hacer pruebas o si quereis para algunas cosas de las que vayamos viendo\n   podemos usar el PLAYGROUND de Go SuperPlayground [https://play.golang.org/],\n   super util para compartir código.\n * Como última opción y la que más gusta es Visual Studio Code, para mi es un\n   acercamiento a las aplicaciones de JetBrains (que para mi son de lo mejor que\n   hay). Como es la que uso veamos un poco su configuración.\n\nVisual Studio Code\nCon cualquier IDE y como programadores, nos pueden interesar mínimo 2 cosas para\nagilizar un poco nuestro trabajo:\n\n * Que nos indique errores cuanto antes\n * Y poder hacer debug de nuestro código para poder resolver mejor los problemas\n   que nos vayamos encontrando.\n\nPues estas dos cosas y algún extra como las sugerencias son las que nos ofrece\neste IDE con algunas configuraciones.\n\nLo primero es instalar el plugin de Go desde la aplicación. Para ello tenemos\nque buscar la ventana de extensiones, creo que en todas ellas esta en el menu\nsuperior de la aplicación en la pestaña ver o view, seleccionamos extensiones o \nextensions\n\nY en la ventana que nos aparece buscamos Go\n\nY entre todas las extensiones que nos aparecen buscamos la de lukehoban y la\ninstalamos.\nUna vez que termine nos pedirá reiniciar la aplicación, y una vez que reinicie\nlo mejor es crear un fichero nuevo y ponerle extension .go.\n\nHacemos esta para que el propio visual studio nos complete la instalación, ya\nque cuando guardemos el fichero nos aparecerán algunos mensajes como este:\n\nBásicamente en todos los que nos pregunte tenemos que indicarle Install All\n\nTambién es posible que nos indique que configuremos el GOPATH para que os hagáis\nuna idea ese seria el Workspace desde donde trabajaremos, si os sale eso en \nDoc-GOPATH [https://golang.org/doc/code.html#GOPATH] o en Test Install GO\n[https://golang.org/doc/install?#testing] tenéis info para que identifiquéis\nbien lo que es y podáis configurarlo correctamente.\n\nLo segundo es configurar para poder hacer debug, lo más fácil es que miréis en\nla documentación del creador Derekparker-delve\n[https://github.com/derekparker/delve/tree/master/Documentation/installation],\naquí según vuestro sistema operativo tenéis las instrucciones. En general suele\nvaler con hacer\n\ngo get github.com/derekparker/delve/cmd/dlv\n\n\nAunque depende un poco de la versión de sistema, como he comentado lo mejor es\nque miréis la documentación.\nY una vez que lo tengáis instalado ya podremos ir poniendo lo que se conoce como\npuntos de interrupción para controlar lo que hace nuestro código.\n\nCon hacer click un par de veces al lado del número de linea es suficiente. Y\npara comprobar que funciona pulsamos sobre F5 o nos vamos al menú Depurar y\npulsamos Iniciar depuración\n\n\nY entonces nuestro IDE cambiará al modo debug que lo que nos hará será parar la\nejecución del código donde tengamos los puntos y podemos ver como están las\nvariables o lo que tengamos en el código.\n\n\nComo veis en la imagen variables a la izquierda, pila de llamadas un poco más\nabajo, puntos de interrupción.... todo muy útil sobretodo cuando tenemos\nproblemas con nuestro código.\n\nY con esto finalizo este post(por fiiiin!!! ) y ya en los siguientes empezaremos\ncon lo bueno.\nSi tenéis dudas o problemas ponerlo en los comentarios.\nCiaaaao","html":"<!--kg-card-begin: markdown--><p>Empiezo con una nueva sección, mi aventura con el lenguaje GO, el cual he descubierto que me encanta, es un lenguaje muy bueno y sencillo para tratar con temas de concurrencia y realmente hace un montón de cosas por si solo(como su paquete net que hace la vida mas fácil en cuanto a servidor Web se refiere), lo vamos a ir viendo poco a poco. Sin mucho más empecemos</p>\n<h2 id=\"instalacin\">Instalación</h2>\n<p>El lenguaje lo podemos escribir desde cualquier editor de texto pero es necesario instalar el compilador y realizar algunas configuraciones. Desde la propia página <a href=\"https://golang.org/dl/\">Go Download</a> están los paquetes, y las instrucciones. También es posible instalarlo con <strong>Homebrew</strong> (si lo usamos).</p>\n<pre><code>brew install golang\n</code></pre>\n<p>Para la correcta instalación tenemos que tener en cuenta que es necesario configurar ciertas variables de entorno, teneis toda la información en:<br>\n<a href=\"https://golang.org/doc/install\">Instalación GO</a></p>\n<p>Haceros a la idea de que la documentación de Go es bastante completa por lo que en general encontraremos todo lo que necesitemos aquí:<br>\n<a href=\"https://golang.org/doc/\">Documentación GO</a></p>\n<p>Solo como aclaración tener en cuenta lo que comenta la documentación sobre los variables de entorno, si ejecutamos algún intalador (MAC/Windows) no deberíamos tener que hacer nada, si algo no funciona comprobar que existe en la variable de entorno $PATH la referencia a Go y que es correcta:</p>\n<pre><code>Windows\nc:\\Go\\bin\nMac\necho $PATH &lt;- nos devuelve lo que tenemos ahora mismo en el path\nEsto deberia devolvernos una cadena de texto muy larga que en algún punto deberia poner algo similar a esto\n/usr/local/go/bin\n</code></pre>\n<p>Si lo hacemos en Linux o con cualquier source, lo mejor es extraer el contenido en las rutas recomendadas y configurar las variables de entorno como aparece en la documentación.</p>\n<p>Si tenéis algún problema buscar en internet que hay mucha información sobre esto, aun así si continuáis con problemas ponerlo en los comentarios e intentamos resolverlo.</p>\n<p>Antes de continuar un detalle de algunas carpetas del directorio de Go, por si quereis buscar algo:</p>\n<pre><code>bin &lt;- binarios,  los que instalamos con go install\npackage o pkg &lt;- Trabajar con los wrappers dentro de nuestro código. Encapsuladores de C.\nsrc &lt;- Todo nuestro código fuente y la librerías de terceros. Las puede descargar go al realizar los imports en nuestras clases, o las podemos poner nosotros. Aqui es donde suele buscar el origen de los imports.\n</code></pre>\n<h2 id=\"algunosdetallessobrego\">Algunos detalles sobre GO</h2>\n<p>Go es un lenguaje <strong>compilado</strong> no interpretado, es decir, el código es compilado (transformado) a lenguaje máquina con lo que se genera un ejecutable que funcionará sin necesidad de nada más para la arquitectura para la que fue creado. Si hablamos de los errores, en este tipo de lenguajes deberíamos verlos en el proceso de compilación, pero veremos como con GO podemos probar nuestro código sin necesidad de compilar.</p>\n<p>Un lenguaje interpretado es aquel en el que un tercero(normalmente llamado intérprete) lee nuestro código y lo traduce a código máquina, esto sucede cada vez que lo ejecutamos, y los errores los detectamos en este tiempo de ejecución.</p>\n<p>Go es un lenguaje que se usa mucho para scripting en backend ya que es bastante rápido en ejecutar, sus librerías básicas cubren mogollón de escenarios y como he comentado el mismo script lo podriamos compilar para todos los S.O, aunque esto depende un poco de lo que haga jejejeje, no es tan mágico como suena. Personalmente me encanta por la parte de concurrencia y la parte de Web Server, que si mezclamos ambas cosas podemos hacer cosas muy curiosas y que consuman pocos recursos.<br>\nComo ejemplo pongo un caso de uso de la empresa <a href=\"https://es.malwarebytes.com/\">Malwarebytes</a>  en el que gestionan <strong>1 Millón</strong> que bajaron sus consumos en un porcentaje muy alto usando GO  <a href=\"http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/\">link</a>. No se a vosotros pero a mi me parece muy interesante poder hacer cosas como esa.</p>\n<p>Es un lenguaje con tipado estático, esto quiere decir que desde el principio al declarar las variables tenemos que indicarle el tipo que son. Aunque es cierto que GO tiene una forma de declaración y asignación de variables, en la que el lenguaje hace lo que se conoce como &quot;inferencia de tipos&quot;, o lo que es lo mismo, el propio lenguaje define el tipo de la variable según el valor asignado(veremos mas adelante ambas formas)</p>\n<p>Por último comentar que es un lenguaje que tiene características similares a C (como puede ser que usa punteros), compila directamente en ensamblador y un extra que es muy útil y que nos ahorra quebraderos de cabeza es que tiene <strong>recolector de basura</strong> es decir, no tenemos que controlar el estado de las variables o funciones para saber si se estan usando o no, ya lo hace Go por nosotros y aunque afecta un poco al rendimiento (realmente es muy poquito), es de agradecer a la hora de programar</p>\n<h2 id=\"holamundo\">Hola Mundo</h2>\n<p>Como ya he escrito bastante rollo, vamos a trabajar un pelín con go.<br>\nAntes de empezar primero comprobamos que tenemos bien instalado Go, para ello desde cualquier linea de comandos (da igual Windows/Mac/Linux) escribimos:</p>\n<pre><code>go version\n</code></pre>\n<p>Y deberíamos ver algo como esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-01-a-las-21.29.26.png\" alt=\"\"><br>\nSi lo vemos todo va bien, si a alguien no le aparece o tiene problemas que lo vaya poniendo en los comentarios y vemos como lo solucionamos.</p>\n<p>Ahora abrimos un fichero de texto escribimos siguiente y guardamos como <strong>main.go</strong>:</p>\n<pre><code>package main\n\nimport &quot;fmt&quot;\n\nfunc main() {\n   fmt.Println(&quot;Hello Power Rangers&quot;)\n}\n</code></pre>\n<p>Con el fichero guardado, nos situamos en la ruta donde lo tengamos en nuestra linea de comandos y ejecutamos:</p>\n<pre><code>go run main.go\n</code></pre>\n<p>Esto nos deberia mostrar algo similar a esto en la consola:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-01-a-las-21.42.38.png\" alt=\"\"><br>\nVoilá ya tenemos nuestro hola mundo. Ya iremos viendo lo que es cada cosa que hemos escrito, esto es solo para que escribamos un poco y veamos que funciona.</p>\n<h2 id=\"ides\">IDEs</h2>\n<p>Lo último que vamos a ver en este post, serán los IDE, que yo no se vosotros, pero a mi el modo <strong>Chuck Norris</strong> para programar (hacerlo directamente en un fichero de texto) no es lo que mas me convence, si tenemos posibilidades de que nos ayuden un pelín de alguna forma yo lo agradezco, pero como ya he comentado se puede hacer con cualquier editor de texto.</p>\n<p>Para programar con Go tenemos varias opciones:</p>\n<ul>\n<li>Podemos hacerlo en un fichero de texto(Chuck Norris/Bruce Lee/Yoda mode) como ya he comentado</li>\n<li>Otra opción es usar <strong>Sublime Text</strong> una gran mayoria de vosotros ya lo conocereis, y como siempre pues tenemos plugins que la comunidad ha creado <a href=\"https://github.com/DisposaBoy/GoSublime\">Ejemplo</a> lo que le daria algunas vitaminas a nuestro editor para trabajar con Go.</li>\n<li>Tambien es posible usar <strong>Atom</strong>. Sigue la misma teoría que Sublime, tenemos plugins que nos ayudan con Go <a href=\"https://atom.io/packages/go-plus\">Ejemplo</a></li>\n<li>Los grandes de <a href=\"https://www.jetbrains.com/\">JetBrains</a> están preparando un IDE muy completo (como siempre previo pago), y ahora tenemos disponibles algunos plugins para algunos de sus IDEs actuales.</li>\n<li>Para hacer pruebas o si quereis para algunas cosas de las que vayamos viendo podemos usar el <strong>PLAYGROUND</strong> de Go <a href=\"https://play.golang.org/\">SuperPlayground</a>, super util para compartir código.</li>\n<li>Como última opción y la que más gusta es <strong>Visual Studio Code</strong>, para mi es un acercamiento a las aplicaciones de JetBrains (que para mi son de lo mejor que hay). Como es la que uso veamos un poco su configuración.</li>\n</ul>\n<h2 id=\"visualstudiocode\">Visual Studio Code</h2>\n<p>Con cualquier IDE y como programadores, nos pueden interesar mínimo 2 cosas para agilizar un poco nuestro trabajo:</p>\n<ul>\n<li>Que nos indique errores cuanto antes</li>\n<li>Y poder hacer debug de nuestro código para poder resolver mejor los problemas que nos vayamos encontrando.</li>\n</ul>\n<p>Pues estas dos cosas y algún extra como las sugerencias son las que nos ofrece este IDE con algunas configuraciones.</p>\n<p><strong>Lo primero</strong> es instalar el plugin de Go desde la aplicación. Para ello tenemos que buscar la ventana de extensiones, creo que en todas ellas esta en el menu superior de la aplicación en la pestaña <strong>ver</strong> o <strong>view</strong>, seleccionamos <strong>extensiones</strong> o <strong>extensions</strong><br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Screen-Shot-2017-06-02-at-21.48.18.png\" alt=\"\"><br>\nY en la ventana que nos aparece buscamos <strong>Go</strong><br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Screen-Shot-2017-06-02-at-21.49.22.png\" alt=\"\"><br>\nY entre todas las extensiones que nos aparecen buscamos la de <strong>lukehoban</strong> y la instalamos.<br>\nUna vez que termine nos pedirá reiniciar la aplicación, y una vez que reinicie lo mejor es crear un fichero nuevo y ponerle extension <strong>.go</strong>.</p>\n<p>Hacemos esta para que el propio visual studio nos complete la instalación, ya que cuando guardemos el fichero nos aparecerán algunos mensajes como este:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Screen-Shot-2017-06-02-at-21.52.55.png\" alt=\"\"><br>\nBásicamente en todos los que nos pregunte tenemos que indicarle <strong>Install All</strong></p>\n<p>También es posible que nos indique que configuremos el <strong>GOPATH</strong> para que os hagáis una idea ese seria el <strong>Workspace</strong> desde donde trabajaremos, si os sale eso en <a href=\"https://golang.org/doc/code.html#GOPATH\">Doc-GOPATH</a> o en <a href=\"https://golang.org/doc/install?#testing\">Test Install GO</a> tenéis info para que identifiquéis bien lo que es y podáis configurarlo correctamente.</p>\n<p><strong>Lo segundo</strong> es configurar para poder hacer debug, lo más fácil es que miréis en la documentación del creador <a href=\"https://github.com/derekparker/delve/tree/master/Documentation/installation\">Derekparker-delve</a>, aquí según vuestro sistema operativo tenéis las instrucciones. En general suele valer con hacer</p>\n<pre><code>go get github.com/derekparker/delve/cmd/dlv\n</code></pre>\n<p>Aunque depende un poco de la versión de sistema, como he comentado lo mejor es que miréis la documentación.<br>\nY una vez que lo tengáis instalado ya podremos ir poniendo lo que se conoce como puntos de interrupción para controlar lo que hace nuestro código.<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-03-a-las-11.30.43.png\" alt=\"\"><br>\nCon hacer click un par de veces al lado del número de linea es suficiente. Y para comprobar que funciona pulsamos sobre <strong>F5</strong> o nos vamos al menú <strong>Depurar</strong> y pulsamos <strong>Iniciar depuración</strong><br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-03-a-las-11.33.03.png\" alt=\"\"></p>\n<p>Y entonces nuestro IDE cambiará al modo <strong>debug</strong> que lo que nos hará será parar la ejecución del código donde tengamos los puntos y podemos ver como están las variables o lo que tengamos en el código.<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-03-a-las-11.39.06.png\" alt=\"\"></p>\n<p>Como veis en la imagen variables a la izquierda, pila de llamadas un poco más abajo, puntos de interrupción.... todo muy útil sobretodo cuando tenemos problemas con nuestro código.</p>\n<p>Y con esto finalizo este post(por fiiiin!!! ) y ya en los siguientes empezaremos con lo bueno.<br>\nSi tenéis dudas o problemas ponerlo en los comentarios.<br>\nCiaaaao</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/go-go-power-ra-ah-que-no-go-parte1-intro-y-preparacion/","canonical_url":null,"uuid":"a34ed728-20bf-4ff5-bb14-b2e1023167d9","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"18","reading_time":7,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Empiezo con una nueva sección, mi aventura con el lenguaje GO, el cual he descubierto que me encanta, es un lenguaje muy bueno y sencillo para tratar con temas de concurrencia y realmente hace un montón de cosas por si solo(como su paquete net que hace la vida mas fácil en cuanto a servidor Web se refiere), lo vamos a ir viendo poco a poco. Sin mucho más empecemos</p>\n<h2 id=\"instalacin\">Instalación</h2>\n<p>El lenguaje lo podemos escribir desde cualquier editor de texto pero es necesario instalar el compilador y realizar algunas configuraciones. Desde la propia página <a href=\"https://golang.org/dl/\">Go Download</a> están los paquetes, y las instrucciones. También es posible instalarlo con <strong>Homebrew</strong> (si lo usamos).</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">brew install golang\n</code></pre></div>\n<p>Para la correcta instalación tenemos que tener en cuenta que es necesario configurar ciertas variables de entorno, teneis toda la información en:<br>\n<a href=\"https://golang.org/doc/install\">Instalación GO</a></p>\n<p>Haceros a la idea de que la documentación de Go es bastante completa por lo que en general encontraremos todo lo que necesitemos aquí:<br>\n<a href=\"https://golang.org/doc/\">Documentación GO</a></p>\n<p>Solo como aclaración tener en cuenta lo que comenta la documentación sobre los variables de entorno, si ejecutamos algún intalador (MAC/Windows) no deberíamos tener que hacer nada, si algo no funciona comprobar que existe en la variable de entorno $PATH la referencia a Go y que es correcta:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Windows\nc:\\Go\\bin\nMac\necho $PATH &#x3C;- nos devuelve lo que tenemos ahora mismo en el path\nEsto deberia devolvernos una cadena de texto muy larga que en algún punto deberia poner algo similar a esto\n/usr/local/go/bin\n</code></pre></div>\n<p>Si lo hacemos en Linux o con cualquier source, lo mejor es extraer el contenido en las rutas recomendadas y configurar las variables de entorno como aparece en la documentación.</p>\n<p>Si tenéis algún problema buscar en internet que hay mucha información sobre esto, aun así si continuáis con problemas ponerlo en los comentarios e intentamos resolverlo.</p>\n<p>Antes de continuar un detalle de algunas carpetas del directorio de Go, por si quereis buscar algo:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">bin &#x3C;- binarios,  los que instalamos con go install\npackage o pkg &#x3C;- Trabajar con los wrappers dentro de nuestro código. Encapsuladores de C.\nsrc &#x3C;- Todo nuestro código fuente y la librerías de terceros. Las puede descargar go al realizar los imports en nuestras clases, o las podemos poner nosotros. Aqui es donde suele buscar el origen de los imports.\n</code></pre></div>\n<h2 id=\"algunosdetallessobrego\">Algunos detalles sobre GO</h2>\n<p>Go es un lenguaje <strong>compilado</strong> no interpretado, es decir, el código es compilado (transformado) a lenguaje máquina con lo que se genera un ejecutable que funcionará sin necesidad de nada más para la arquitectura para la que fue creado. Si hablamos de los errores, en este tipo de lenguajes deberíamos verlos en el proceso de compilación, pero veremos como con GO podemos probar nuestro código sin necesidad de compilar.</p>\n<p>Un lenguaje interpretado es aquel en el que un tercero(normalmente llamado intérprete) lee nuestro código y lo traduce a código máquina, esto sucede cada vez que lo ejecutamos, y los errores los detectamos en este tiempo de ejecución.</p>\n<p>Go es un lenguaje que se usa mucho para scripting en backend ya que es bastante rápido en ejecutar, sus librerías básicas cubren mogollón de escenarios y como he comentado el mismo script lo podriamos compilar para todos los S.O, aunque esto depende un poco de lo que haga jejejeje, no es tan mágico como suena. Personalmente me encanta por la parte de concurrencia y la parte de Web Server, que si mezclamos ambas cosas podemos hacer cosas muy curiosas y que consuman pocos recursos.<br>\nComo ejemplo pongo un caso de uso de la empresa <a href=\"https://es.malwarebytes.com/\">Malwarebytes</a>  en el que gestionan <strong>1 Millón</strong> que bajaron sus consumos en un porcentaje muy alto usando GO  <a href=\"http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/\">link</a>. No se a vosotros pero a mi me parece muy interesante poder hacer cosas como esa.</p>\n<p>Es un lenguaje con tipado estático, esto quiere decir que desde el principio al declarar las variables tenemos que indicarle el tipo que son. Aunque es cierto que GO tiene una forma de declaración y asignación de variables, en la que el lenguaje hace lo que se conoce como \"inferencia de tipos\", o lo que es lo mismo, el propio lenguaje define el tipo de la variable según el valor asignado(veremos mas adelante ambas formas)</p>\n<p>Por último comentar que es un lenguaje que tiene características similares a C (como puede ser que usa punteros), compila directamente en ensamblador y un extra que es muy útil y que nos ahorra quebraderos de cabeza es que tiene <strong>recolector de basura</strong> es decir, no tenemos que controlar el estado de las variables o funciones para saber si se estan usando o no, ya lo hace Go por nosotros y aunque afecta un poco al rendimiento (realmente es muy poquito), es de agradecer a la hora de programar</p>\n<h2 id=\"holamundo\">Hola Mundo</h2>\n<p>Como ya he escrito bastante rollo, vamos a trabajar un pelín con go.<br>\nAntes de empezar primero comprobamos que tenemos bien instalado Go, para ello desde cualquier linea de comandos (da igual Windows/Mac/Linux) escribimos:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">go version\n</code></pre></div>\n<p>Y deberíamos ver algo como esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-01-a-las-21.29.26.png\" alt=\"\"><br>\nSi lo vemos todo va bien, si a alguien no le aparece o tiene problemas que lo vaya poniendo en los comentarios y vemos como lo solucionamos.</p>\n<p>Ahora abrimos un fichero de texto escribimos siguiente y guardamos como <strong>main.go</strong>:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">package main\n\nimport \"fmt\"\n\nfunc main() {\n   fmt.Println(\"Hello Power Rangers\")\n}\n</code></pre></div>\n<p>Con el fichero guardado, nos situamos en la ruta donde lo tengamos en nuestra linea de comandos y ejecutamos:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">go run main.go\n</code></pre></div>\n<p>Esto nos deberia mostrar algo similar a esto en la consola:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-01-a-las-21.42.38.png\" alt=\"\"><br>\nVoilá ya tenemos nuestro hola mundo. Ya iremos viendo lo que es cada cosa que hemos escrito, esto es solo para que escribamos un poco y veamos que funciona.</p>\n<h2 id=\"ides\">IDEs</h2>\n<p>Lo último que vamos a ver en este post, serán los IDE, que yo no se vosotros, pero a mi el modo <strong>Chuck Norris</strong> para programar (hacerlo directamente en un fichero de texto) no es lo que mas me convence, si tenemos posibilidades de que nos ayuden un pelín de alguna forma yo lo agradezco, pero como ya he comentado se puede hacer con cualquier editor de texto.</p>\n<p>Para programar con Go tenemos varias opciones:</p>\n<ul>\n<li>Podemos hacerlo en un fichero de texto(Chuck Norris/Bruce Lee/Yoda mode) como ya he comentado</li>\n<li>Otra opción es usar <strong>Sublime Text</strong> una gran mayoria de vosotros ya lo conocereis, y como siempre pues tenemos plugins que la comunidad ha creado <a href=\"https://github.com/DisposaBoy/GoSublime\">Ejemplo</a> lo que le daria algunas vitaminas a nuestro editor para trabajar con Go.</li>\n<li>Tambien es posible usar <strong>Atom</strong>. Sigue la misma teoría que Sublime, tenemos plugins que nos ayudan con Go <a href=\"https://atom.io/packages/go-plus\">Ejemplo</a></li>\n<li>Los grandes de <a href=\"https://www.jetbrains.com/\">JetBrains</a> están preparando un IDE muy completo (como siempre previo pago), y ahora tenemos disponibles algunos plugins para algunos de sus IDEs actuales.</li>\n<li>Para hacer pruebas o si quereis para algunas cosas de las que vayamos viendo podemos usar el <strong>PLAYGROUND</strong> de Go <a href=\"https://play.golang.org/\">SuperPlayground</a>, super util para compartir código.</li>\n<li>Como última opción y la que más gusta es <strong>Visual Studio Code</strong>, para mi es un acercamiento a las aplicaciones de JetBrains (que para mi son de lo mejor que hay). Como es la que uso veamos un poco su configuración.</li>\n</ul>\n<h2 id=\"visualstudiocode\">Visual Studio Code</h2>\n<p>Con cualquier IDE y como programadores, nos pueden interesar mínimo 2 cosas para agilizar un poco nuestro trabajo:</p>\n<ul>\n<li>Que nos indique errores cuanto antes</li>\n<li>Y poder hacer debug de nuestro código para poder resolver mejor los problemas que nos vayamos encontrando.</li>\n</ul>\n<p>Pues estas dos cosas y algún extra como las sugerencias son las que nos ofrece este IDE con algunas configuraciones.</p>\n<p><strong>Lo primero</strong> es instalar el plugin de Go desde la aplicación. Para ello tenemos que buscar la ventana de extensiones, creo que en todas ellas esta en el menu superior de la aplicación en la pestaña <strong>ver</strong> o <strong>view</strong>, seleccionamos <strong>extensiones</strong> o <strong>extensions</strong><br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Screen-Shot-2017-06-02-at-21.48.18.png\" alt=\"\"><br>\nY en la ventana que nos aparece buscamos <strong>Go</strong><br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Screen-Shot-2017-06-02-at-21.49.22.png\" alt=\"\"><br>\nY entre todas las extensiones que nos aparecen buscamos la de <strong>lukehoban</strong> y la instalamos.<br>\nUna vez que termine nos pedirá reiniciar la aplicación, y una vez que reinicie lo mejor es crear un fichero nuevo y ponerle extension <strong>.go</strong>.</p>\n<p>Hacemos esta para que el propio visual studio nos complete la instalación, ya que cuando guardemos el fichero nos aparecerán algunos mensajes como este:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Screen-Shot-2017-06-02-at-21.52.55.png\" alt=\"\"><br>\nBásicamente en todos los que nos pregunte tenemos que indicarle <strong>Install All</strong></p>\n<p>También es posible que nos indique que configuremos el <strong>GOPATH</strong> para que os hagáis una idea ese seria el <strong>Workspace</strong> desde donde trabajaremos, si os sale eso en <a href=\"https://golang.org/doc/code.html#GOPATH\">Doc-GOPATH</a> o en <a href=\"https://golang.org/doc/install?#testing\">Test Install GO</a> tenéis info para que identifiquéis bien lo que es y podáis configurarlo correctamente.</p>\n<p><strong>Lo segundo</strong> es configurar para poder hacer debug, lo más fácil es que miréis en la documentación del creador <a href=\"https://github.com/derekparker/delve/tree/master/Documentation/installation\">Derekparker-delve</a>, aquí según vuestro sistema operativo tenéis las instrucciones. En general suele valer con hacer</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">go get github.com/derekparker/delve/cmd/dlv\n</code></pre></div>\n<p>Aunque depende un poco de la versión de sistema, como he comentado lo mejor es que miréis la documentación.<br>\nY una vez que lo tengáis instalado ya podremos ir poniendo lo que se conoce como puntos de interrupción para controlar lo que hace nuestro código.<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-03-a-las-11.30.43.png\" alt=\"\"><br>\nCon hacer click un par de veces al lado del número de linea es suficiente. Y para comprobar que funciona pulsamos sobre <strong>F5</strong> o nos vamos al menú <strong>Depurar</strong> y pulsamos <strong>Iniciar depuración</strong><br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-03-a-las-11.33.03.png\" alt=\"\"></p>\n<p>Y entonces nuestro IDE cambiará al modo <strong>debug</strong> que lo que nos hará será parar la ejecución del código donde tengamos los puntos y podemos ver como están las variables o lo que tengamos en el código.<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-03-a-las-11.39.06.png\" alt=\"\"></p>\n<p>Como veis en la imagen variables a la izquierda, pila de llamadas un poco más abajo, puntos de interrupción.... todo muy útil sobretodo cuando tenemos problemas con nuestro código.</p>\n<p>Y con esto finalizo este post(por fiiiin!!! ) y ya en los siguientes empezaremos con lo bueno.<br>\nSi tenéis dudas o problemas ponerlo en los comentarios.<br>\nCiaaaao</p>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Empiezo con una nueva sección, mi aventura con el lenguaje GO, el cual he descubierto que me encanta, es un lenguaje muy bueno y sencillo para tratar con temas de concurrencia y realmente hace un montón de cosas por si solo(como su paquete net que hace la vida mas fácil en cuanto a servidor Web se refiere), lo vamos a ir viendo poco a poco. Sin mucho más empecemos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"instalacin"},"children":[{"type":"text","value":"Instalación"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"El lenguaje lo podemos escribir desde cualquier editor de texto pero es necesario instalar el compilador y realizar algunas configuraciones. Desde la propia página "},{"type":"element","tagName":"a","properties":{"href":"https://golang.org/dl/"},"children":[{"type":"text","value":"Go Download"}]},{"type":"text","value":" están los paquetes, y las instrucciones. También es posible instalarlo con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Homebrew"}]},{"type":"text","value":" (si lo usamos)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"brew install golang\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para la correcta instalación tenemos que tener en cuenta que es necesario configurar ciertas variables de entorno, teneis toda la información en:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"a","properties":{"href":"https://golang.org/doc/install"},"children":[{"type":"text","value":"Instalación GO"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Haceros a la idea de que la documentación de Go es bastante completa por lo que en general encontraremos todo lo que necesitemos aquí:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"a","properties":{"href":"https://golang.org/doc/"},"children":[{"type":"text","value":"Documentación GO"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Solo como aclaración tener en cuenta lo que comenta la documentación sobre los variables de entorno, si ejecutamos algún intalador (MAC/Windows) no deberíamos tener que hacer nada, si algo no funciona comprobar que existe en la variable de entorno $PATH la referencia a Go y que es correcta:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Windows\nc:\\Go\\bin\nMac\necho $PATH <- nos devuelve lo que tenemos ahora mismo en el path\nEsto deberia devolvernos una cadena de texto muy larga que en algún punto deberia poner algo similar a esto\n/usr/local/go/bin\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si lo hacemos en Linux o con cualquier source, lo mejor es extraer el contenido en las rutas recomendadas y configurar las variables de entorno como aparece en la documentación."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si tenéis algún problema buscar en internet que hay mucha información sobre esto, aun así si continuáis con problemas ponerlo en los comentarios e intentamos resolverlo."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Antes de continuar un detalle de algunas carpetas del directorio de Go, por si quereis buscar algo:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bin <- binarios,  los que instalamos con go install\npackage o pkg <- Trabajar con los wrappers dentro de nuestro código. Encapsuladores de C.\nsrc <- Todo nuestro código fuente y la librerías de terceros. Las puede descargar go al realizar los imports en nuestras clases, o las podemos poner nosotros. Aqui es donde suele buscar el origen de los imports.\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"algunosdetallessobrego"},"children":[{"type":"text","value":"Algunos detalles sobre GO"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Go es un lenguaje "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"compilado"}]},{"type":"text","value":" no interpretado, es decir, el código es compilado (transformado) a lenguaje máquina con lo que se genera un ejecutable que funcionará sin necesidad de nada más para la arquitectura para la que fue creado. Si hablamos de los errores, en este tipo de lenguajes deberíamos verlos en el proceso de compilación, pero veremos como con GO podemos probar nuestro código sin necesidad de compilar."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Un lenguaje interpretado es aquel en el que un tercero(normalmente llamado intérprete) lee nuestro código y lo traduce a código máquina, esto sucede cada vez que lo ejecutamos, y los errores los detectamos en este tiempo de ejecución."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Go es un lenguaje que se usa mucho para scripting en backend ya que es bastante rápido en ejecutar, sus librerías básicas cubren mogollón de escenarios y como he comentado el mismo script lo podriamos compilar para todos los S.O, aunque esto depende un poco de lo que haga jejejeje, no es tan mágico como suena. Personalmente me encanta por la parte de concurrencia y la parte de Web Server, que si mezclamos ambas cosas podemos hacer cosas muy curiosas y que consuman pocos recursos."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nComo ejemplo pongo un caso de uso de la empresa "},{"type":"element","tagName":"a","properties":{"href":"https://es.malwarebytes.com/"},"children":[{"type":"text","value":"Malwarebytes"}]},{"type":"text","value":"  en el que gestionan "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1 Millón"}]},{"type":"text","value":" que bajaron sus consumos en un porcentaje muy alto usando GO  "},{"type":"element","tagName":"a","properties":{"href":"http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/"},"children":[{"type":"text","value":"link"}]},{"type":"text","value":". No se a vosotros pero a mi me parece muy interesante poder hacer cosas como esa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Es un lenguaje con tipado estático, esto quiere decir que desde el principio al declarar las variables tenemos que indicarle el tipo que son. Aunque es cierto que GO tiene una forma de declaración y asignación de variables, en la que el lenguaje hace lo que se conoce como \"inferencia de tipos\", o lo que es lo mismo, el propio lenguaje define el tipo de la variable según el valor asignado(veremos mas adelante ambas formas)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Por último comentar que es un lenguaje que tiene características similares a C (como puede ser que usa punteros), compila directamente en ensamblador y un extra que es muy útil y que nos ahorra quebraderos de cabeza es que tiene "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"recolector de basura"}]},{"type":"text","value":" es decir, no tenemos que controlar el estado de las variables o funciones para saber si se estan usando o no, ya lo hace Go por nosotros y aunque afecta un poco al rendimiento (realmente es muy poquito), es de agradecer a la hora de programar"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"holamundo"},"children":[{"type":"text","value":"Hola Mundo"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como ya he escrito bastante rollo, vamos a trabajar un pelín con go."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nAntes de empezar primero comprobamos que tenemos bien instalado Go, para ello desde cualquier linea de comandos (da igual Windows/Mac/Linux) escribimos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"go version\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y deberíamos ver algo como esto:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-01-a-las-21.29.26.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nSi lo vemos todo va bien, si a alguien no le aparece o tiene problemas que lo vaya poniendo en los comentarios y vemos como lo solucionamos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora abrimos un fichero de texto escribimos siguiente y guardamos como "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"main.go"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"package main\n\nimport \"fmt\"\n\nfunc main() {\n   fmt.Println(\"Hello Power Rangers\")\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Con el fichero guardado, nos situamos en la ruta donde lo tengamos en nuestra linea de comandos y ejecutamos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"go run main.go\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto nos deberia mostrar algo similar a esto en la consola:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-01-a-las-21.42.38.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nVoilá ya tenemos nuestro hola mundo. Ya iremos viendo lo que es cada cosa que hemos escrito, esto es solo para que escribamos un poco y veamos que funciona."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"ides"},"children":[{"type":"text","value":"IDEs"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo último que vamos a ver en este post, serán los IDE, que yo no se vosotros, pero a mi el modo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Chuck Norris"}]},{"type":"text","value":" para programar (hacerlo directamente en un fichero de texto) no es lo que mas me convence, si tenemos posibilidades de que nos ayuden un pelín de alguna forma yo lo agradezco, pero como ya he comentado se puede hacer con cualquier editor de texto."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para programar con Go tenemos varias opciones:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Podemos hacerlo en un fichero de texto(Chuck Norris/Bruce Lee/Yoda mode) como ya he comentado"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Otra opción es usar "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Sublime Text"}]},{"type":"text","value":" una gran mayoria de vosotros ya lo conocereis, y como siempre pues tenemos plugins que la comunidad ha creado "},{"type":"element","tagName":"a","properties":{"href":"https://github.com/DisposaBoy/GoSublime"},"children":[{"type":"text","value":"Ejemplo"}]},{"type":"text","value":" lo que le daria algunas vitaminas a nuestro editor para trabajar con Go."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tambien es posible usar "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Atom"}]},{"type":"text","value":". Sigue la misma teoría que Sublime, tenemos plugins que nos ayudan con Go "},{"type":"element","tagName":"a","properties":{"href":"https://atom.io/packages/go-plus"},"children":[{"type":"text","value":"Ejemplo"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Los grandes de "},{"type":"element","tagName":"a","properties":{"href":"https://www.jetbrains.com/"},"children":[{"type":"text","value":"JetBrains"}]},{"type":"text","value":" están preparando un IDE muy completo (como siempre previo pago), y ahora tenemos disponibles algunos plugins para algunos de sus IDEs actuales."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Para hacer pruebas o si quereis para algunas cosas de las que vayamos viendo podemos usar el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"PLAYGROUND"}]},{"type":"text","value":" de Go "},{"type":"element","tagName":"a","properties":{"href":"https://play.golang.org/"},"children":[{"type":"text","value":"SuperPlayground"}]},{"type":"text","value":", super util para compartir código."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Como última opción y la que más gusta es "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Visual Studio Code"}]},{"type":"text","value":", para mi es un acercamiento a las aplicaciones de JetBrains (que para mi son de lo mejor que hay). Como es la que uso veamos un poco su configuración."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"visualstudiocode"},"children":[{"type":"text","value":"Visual Studio Code"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Con cualquier IDE y como programadores, nos pueden interesar mínimo 2 cosas para agilizar un poco nuestro trabajo:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Que nos indique errores cuanto antes"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Y poder hacer debug de nuestro código para poder resolver mejor los problemas que nos vayamos encontrando."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pues estas dos cosas y algún extra como las sugerencias son las que nos ofrece este IDE con algunas configuraciones."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Lo primero"}]},{"type":"text","value":" es instalar el plugin de Go desde la aplicación. Para ello tenemos que buscar la ventana de extensiones, creo que en todas ellas esta en el menu superior de la aplicación en la pestaña "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ver"}]},{"type":"text","value":" o "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"view"}]},{"type":"text","value":", seleccionamos "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"extensiones"}]},{"type":"text","value":" o "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"extensions"}]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Screen-Shot-2017-06-02-at-21.48.18.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nY en la ventana que nos aparece buscamos "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Go"}]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Screen-Shot-2017-06-02-at-21.49.22.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nY entre todas las extensiones que nos aparecen buscamos la de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"lukehoban"}]},{"type":"text","value":" y la instalamos."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nUna vez que termine nos pedirá reiniciar la aplicación, y una vez que reinicie lo mejor es crear un fichero nuevo y ponerle extension "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":".go"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hacemos esta para que el propio visual studio nos complete la instalación, ya que cuando guardemos el fichero nos aparecerán algunos mensajes como este:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Screen-Shot-2017-06-02-at-21.52.55.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nBásicamente en todos los que nos pregunte tenemos que indicarle "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Install All"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"También es posible que nos indique que configuremos el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"GOPATH"}]},{"type":"text","value":" para que os hagáis una idea ese seria el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Workspace"}]},{"type":"text","value":" desde donde trabajaremos, si os sale eso en "},{"type":"element","tagName":"a","properties":{"href":"https://golang.org/doc/code.html#GOPATH"},"children":[{"type":"text","value":"Doc-GOPATH"}]},{"type":"text","value":" o en "},{"type":"element","tagName":"a","properties":{"href":"https://golang.org/doc/install?#testing"},"children":[{"type":"text","value":"Test Install GO"}]},{"type":"text","value":" tenéis info para que identifiquéis bien lo que es y podáis configurarlo correctamente."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Lo segundo"}]},{"type":"text","value":" es configurar para poder hacer debug, lo más fácil es que miréis en la documentación del creador "},{"type":"element","tagName":"a","properties":{"href":"https://github.com/derekparker/delve/tree/master/Documentation/installation"},"children":[{"type":"text","value":"Derekparker-delve"}]},{"type":"text","value":", aquí según vuestro sistema operativo tenéis las instrucciones. En general suele valer con hacer"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"go get github.com/derekparker/delve/cmd/dlv\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aunque depende un poco de la versión de sistema, como he comentado lo mejor es que miréis la documentación."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nY una vez que lo tengáis instalado ya podremos ir poniendo lo que se conoce como puntos de interrupción para controlar lo que hace nuestro código."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-03-a-las-11.30.43.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nCon hacer click un par de veces al lado del número de linea es suficiente. Y para comprobar que funciona pulsamos sobre "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"F5"}]},{"type":"text","value":" o nos vamos al menú "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Depurar"}]},{"type":"text","value":" y pulsamos "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Iniciar depuración"}]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-03-a-las-11.33.03.png","alt":""},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y entonces nuestro IDE cambiará al modo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"debug"}]},{"type":"text","value":" que lo que nos hará será parar la ejecución del código donde tengamos los puntos y podemos ver como están las variables o lo que tengamos en el código."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/06/Captura-de-pantalla-2017-06-03-a-las-11.39.06.png","alt":""},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como veis en la imagen variables a la izquierda, pila de llamadas un poco más abajo, puntos de interrupción.... todo muy útil sobretodo cuando tenemos problemas con nuestro código."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y con esto finalizo este post(por fiiiin!!! ) y ya en los siguientes empezaremos con lo bueno."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nSi tenéis dudas o problemas ponerlo en los comentarios."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nCiaaaao"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"instalacin","heading":"Instalación"},{"id":"algunosdetallessobrego","heading":"Algunos detalles sobre GO"},{"id":"holamundo","heading":"Hola Mundo"},{"id":"ides","heading":"IDEs"},{"id":"visualstudiocode","heading":"Visual Studio Code"}]},"featureImageSharp":{"base":"Untitled.png","publicURL":"/static/4c2a69b59a578389653f7d3cb966f439/Untitled.png","imageMeta":{"width":649,"height":244},"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABr0lEQVQoz22RPWhTURiGP+29N/eec3/aK1FjI9RBm3aSSBVBDVSzOGpwiMEhKopmsCnYyUVQwS5WxKU6iGBwdOrQqZOD+EO1HYo/mCBtySSC6+O5CQVjHF7ecw7veb6Xc0RrTa8USnV9S57ZZ2LF3rTqeBwqhiIf3++X9AO3YN11AlfGx7KKyTGX4nhXx/YJg9pGZBuOYxs5WJbVC1QdQBfm6oAwCnl+wWFixDMXPbZbGjulicx58dQko6MHKBQK5HK5jvL5/D8NDcz3NQOO4khGaJSElxXh4knFiaMZTh/22b/HwbYdpms1zpVKTNXrlMtlKpUK1Wq1v2ECVdrHPVPi+N0pns2eZ/7FNFdeP+FVY4a5xzfZcf8BA9fr7B4eZjCKSKfTZLNZ4jj+D9B1CXbuQu495OzaBt/ffWJh5RvF5m9azTbrq2tMfN1E5uZRQYhn8q7nkUql8Iz3ApN2QUAggly6xsjndRY32zz68J6Dtcs8ffuG280NrC9trOpVfJPTYdjzoX1vmEzVJmjfmEFaP5HlJoeWllhuzFJYXEA+tpAfv7Bu3enkkrz6i/EHdxf7UmCHE+cAAAAASUVORK5CYII=","aspectRatio":2.6515151515151514,"src":"/static/4c2a69b59a578389653f7d3cb966f439/d382d/Untitled.png","srcSet":"/static/4c2a69b59a578389653f7d3cb966f439/847ef/Untitled.png 175w,\n/static/4c2a69b59a578389653f7d3cb966f439/91cba/Untitled.png 350w,\n/static/4c2a69b59a578389653f7d3cb966f439/d382d/Untitled.png 649w","srcWebp":"/static/4c2a69b59a578389653f7d3cb966f439/10386/Untitled.webp","srcSetWebp":"/static/4c2a69b59a578389653f7d3cb966f439/9fca7/Untitled.webp 175w,\n/static/4c2a69b59a578389653f7d3cb966f439/37a4e/Untitled.webp 350w,\n/static/4c2a69b59a578389653f7d3cb966f439/10386/Untitled.webp 649w","sizes":"(max-width: 649px) 100vw, 649px"}}}},"allGhostPost":{"edges":[{"node":{"id":"Ghost__Post__5a338158333e0f134c248f16","title":"Go Go Power Ra....ah que no: Go Parte 5 - Maps","slug":"go-go-power-ra-ah-que-no-go-parte-5-maps","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Untitled-2.png","excerpt":"Espero que este post sea bastante rápido jejejejej.\nEn este caso hablaremos de los Maps o lo que en otros lenguajes conoceríamos\ncomo diccionario. En general siguen las mismas teorías que los arrays o los \nslices en cuanto a creación y a lo referente al rendimiento, los mapas crecen\ndinámicamente pero podemos indicarles el tamaño lo que optimizaría un poco su\nrendimiento.\n\nCreación\nEmpecemos con la creación. Como ya hemos visto en Go tenemos siempre varias\nformas de crear los elementos:\n\n * Form","custom_excerpt":null,"visibility":"public","created_at_pretty":"19 Jul 2017","published_at_pretty":"23 Jul 2017","updated_at_pretty":"11 Oct 2017","created_at":"2017-07-19T21:45:34.000+02:00","published_at":"2017-07-23T10:57:00.000+02:00","updated_at":"2017-10-11T13:46:33.000+02:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":null}],"primary_author":{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":{"base":"Perfil.jpg","publicURL":"/static/b0de6281fb28a266510b3b09b9243e5a/Perfil.jpg","imageMeta":{"width":307,"height":307},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGzw6zC6zHn+cLYP//EAB0QAAICAQUAAAAAAAAAAAAAAAEDAAIEEyEiIzL/2gAIAQEAAQUCifca8KgcKWVfUpkHsG5pxX//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARARcQISIUFR/9oACAEBAAY/AhU88xkb7N06a8P/xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMUFRYXH/2gAIAQEAAT8hR2pq40aqb+xIAeXibhW9JXr8joF4TBcSNe0//9oADAMBAAIAAwAAABDzDwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFhcfD/2gAIAQEAAT8QyItrELaTlatLwU63MvEW6vUNdy4LZQDn7iVApV9VLtANdWwKkuYq4Er1VZ//2Q==","aspectRatio":1,"src":"/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg","srcSet":"/static/b0de6281fb28a266510b3b09b9243e5a/f340b/Perfil.jpg 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/22d64/Perfil.jpg 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/aa249/Perfil.jpg 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/0dc33/Perfil.jpg 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/60667/Perfil.jpg 307w","srcWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp","srcSetWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/59cda/Perfil.webp 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/7da75/Perfil.webp 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f282e/Perfil.webp 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/a7b21/Perfil.webp 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f59af/Perfil.webp 307w","sizes":"(max-width: 110px) 100vw, 110px"}}}},"primary_tag":{"slug":"go","url":"https://jlgarcia.fulldev.ninja/tag/go/","name":"Go","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null},"tags":[{"slug":"go","url":"https://jlgarcia.fulldev.ninja/tag/go/","name":"Go","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null},{"slug":"golang","url":"https://jlgarcia.fulldev.ninja/tag/golang/","name":"Golang","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null}],"plaintext":"Espero que este post sea bastante rápido jejejejej.\nEn este caso hablaremos de los Maps o lo que en otros lenguajes conoceríamos\ncomo diccionario. En general siguen las mismas teorías que los arrays o los \nslices en cuanto a creación y a lo referente al rendimiento, los mapas crecen\ndinámicamente pero podemos indicarles el tamaño lo que optimizaría un poco su\nrendimiento.\n\nCreación\nEmpecemos con la creación. Como ya hemos visto en Go tenemos siempre varias\nformas de crear los elementos:\n\n * Forma básica\n\n//var nombreVariable map[tipoClave]tipoValor\nvar rangerRojo map[string]int\n\n\n * Declaración corta:\n\n//Inicializando sin valores\nrangerRojo := map[string]int{}\n\n//Inicializando con valores. Obligatoria la coma ultima\nrangerVerde := map[string]int{\n \"Fuerza\": 10000,\n \"Resistencia\": 5000,\n}\n\n\n * Usando make\n\nrangerVerde := make(map[string]int)\n//Al igual que en los arrays podemos indicar el tamaño para optimizar rendimiento.\nrangerNegro := make(map[string]int, 2)  \n\n\nUsando Map\nYa hemos visto un poco como es la creación de Maps en golang, no es muy\ncomplicado no?, veamos ahora algunos detalles de su uso.\n\nCuando asignamos el valor, realmente este devuelve 2, el contenido que queremos\nsacar y si existe o no. Veamoslo con un ejemplo:\n\nrangerRojo := map[string]int{\n  \"Fuerza\": 10000,\n}\n\nrangerVerde := make(map[string]int)\n\npower, exist := rangerRojo[\"Fuerza\"]\nfmt.Println(\"Valor: \", power, \"Existe: \", exist)\n\npower2, exist2 := rangerVerde[\"Fuerza\"]\nfmt.Println(\"Valor: \", power2, \"Existe: \", exist2)\n\n\nHe usado dos formas de crear maps y el resultado de esto seria:\n\n\nComo veis nos inicializa el valor como suele hacer Go y nos indica que no existe\nrealmente.\n\nBorrando contenido de un Map\nEn este caso Go se vuelve muy útil tiene una función propia para poder eliminar\nel elemento que queramos:\n\ndelete(rangerRojo,\"Fuerza\")\n\n\nProbémoslo en un ejemplo más completo:\n\nrangerRojo := map[string]int{\n\t\"Fuerza\":      10000,\n\t\"Resistencia\": 500,\n}\nfmt.Println(rangerRojo)\n\ndelete(rangerRojo, \"Fuerza\")\n\nfmt.Println(rangerRojo)\n\n\nY como vemos elimina el contenido sin problemas:\n\n\nRecorrer un MAP\nPara recorrer un MAP usamos la misma teoría que para los arrays o slices: RANGE \nvamos directos al ejemplo ya que es bastante simple:\n\nrangerRojo := map[string]interface{}{\n  \"Fuerza\":       10000,\n  \"Resistencia\":  500,\n  \"Inteligencia\": \"200\",\n  \"Arma\":         \"Espada\",\n}\n\nfor key, value := range rangerRojo {\n  fmt.Println(\"Clave: \", key, \" Valor: \", value)\n}\n\n\nTenemos un map que tiene como claves varios strings representando las\ncaracterísticas de nuestro ranger y como valor he introducido algo que no\nhabiamos visto todavia INTERFACE{}, bueno como resumen haceros a la idea de que\nes un tipo especial que funciona como un genérico, es decir, que representa\ncualquier valor(por eso podemos tener valores tipo INT y tipo STRING) y al\nrecorrerlo tenemos esto:\n\nOJO a tener en cuenta, no tiene porque hacerlo en orden sobretodo si\nintroducimos algo a posteriori, mirar un ejemplo:\n\nrangerRojo := map[string]interface{}{\n  \"Fuerza\":       10000,\n  \"Resistencia\":  500,\n  \"Inteligencia\": 150,\n  \"Arma\":         \"Espada\",\n}\n\nrangerRojo[\"Maná\"] = 150\n\nfor key, value := range rangerRojo {\n  fmt.Println(\"Clave: \", key, \" Valor: \", value)\n}\n\n\nHe añadido otra propiedad a nuestro ranger y el resultado es:\n\n\nSi lo ejecuto de nuevo:\n\n\n\nPor último y como he adelantado en el ejemplo anterior:\n\nAñadir elementos a nuestro MAP\nBueno como ya hemos visto esto es muy sencillo:\n\nrangerRojo[\"Maná\"] = 150\n\nfmt.Println(rangerRojo)\n\n\nY nos muestra\n\nPor el momento hemos terminado con los mapas, profundizaremos en el trabajo con\nellos más adelante.\nSin mucho más nos vemos en la siguiente superNinjas :)","html":"<!--kg-card-begin: markdown--><p>Espero que este post sea bastante rápido jejejejej.<br>\nEn este caso hablaremos de los <strong>Maps</strong> o lo que en otros lenguajes conoceríamos como diccionario. En general siguen las mismas teorías que los <strong>arrays</strong> o los <strong>slices</strong> en cuanto a creación y a lo referente al rendimiento, los mapas crecen dinámicamente pero podemos indicarles el tamaño lo que optimizaría un poco su rendimiento.</p>\n<h1 id=\"creacin\">Creación</h1>\n<p>Empecemos con la creación. Como ya hemos visto en Go tenemos siempre varias formas de crear los elementos:</p>\n<ul>\n<li>Forma básica</li>\n</ul>\n<pre><code>//var nombreVariable map[tipoClave]tipoValor\nvar rangerRojo map[string]int\n</code></pre>\n<ul>\n<li>Declaración corta:</li>\n</ul>\n<pre><code>//Inicializando sin valores\nrangerRojo := map[string]int{}\n\n//Inicializando con valores. Obligatoria la coma ultima\nrangerVerde := map[string]int{\n &quot;Fuerza&quot;: 10000,\n &quot;Resistencia&quot;: 5000,\n}\n</code></pre>\n<ul>\n<li>Usando <strong>make</strong></li>\n</ul>\n<pre><code>rangerVerde := make(map[string]int)\n//Al igual que en los arrays podemos indicar el tamaño para optimizar rendimiento.\nrangerNegro := make(map[string]int, 2)  \n</code></pre>\n<h1 id=\"usandomap\">Usando Map</h1>\n<p>Ya hemos visto un poco como es la creación de <strong>Maps</strong> en golang, no es muy complicado no?, veamos ahora algunos detalles de su uso.</p>\n<p>Cuando asignamos el valor, realmente este devuelve 2, el contenido que queremos sacar y si existe o no. Veamoslo con un ejemplo:</p>\n<pre><code>rangerRojo := map[string]int{\n  &quot;Fuerza&quot;: 10000,\n}\n\nrangerVerde := make(map[string]int)\n\npower, exist := rangerRojo[&quot;Fuerza&quot;]\nfmt.Println(&quot;Valor: &quot;, power, &quot;Existe: &quot;, exist)\n\npower2, exist2 := rangerVerde[&quot;Fuerza&quot;]\nfmt.Println(&quot;Valor: &quot;, power2, &quot;Existe: &quot;, exist2)\n</code></pre>\n<p>He usado dos formas de crear maps y el resultado de esto seria:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.08.38.png\" alt=\"Map Exist or Not\"><br>\nComo veis nos inicializa el valor como suele hacer Go y nos indica que no existe realmente.</p>\n<h2 id=\"borrandocontenidodeunmap\">Borrando contenido de un Map</h2>\n<p>En este caso Go se vuelve muy útil tiene una función propia para poder eliminar el elemento que queramos:</p>\n<pre><code>delete(rangerRojo,&quot;Fuerza&quot;)\n</code></pre>\n<p>Probémoslo en un ejemplo más completo:</p>\n<pre><code>rangerRojo := map[string]int{\n\t&quot;Fuerza&quot;:      10000,\n\t&quot;Resistencia&quot;: 500,\n}\nfmt.Println(rangerRojo)\n\ndelete(rangerRojo, &quot;Fuerza&quot;)\n\nfmt.Println(rangerRojo)\n</code></pre>\n<p>Y como vemos elimina el contenido sin problemas:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.16.50.png\" alt=\"Delete in Maps\"></p>\n<h2 id=\"recorrerunmap\">Recorrer un MAP</h2>\n<p>Para recorrer un MAP usamos la misma teoría que para los <strong>arrays</strong> o <strong>slices</strong>: <strong>RANGE</strong> vamos directos al ejemplo ya que es bastante simple:</p>\n<pre><code>rangerRojo := map[string]interface{}{\n  &quot;Fuerza&quot;:       10000,\n  &quot;Resistencia&quot;:  500,\n  &quot;Inteligencia&quot;: &quot;200&quot;,\n  &quot;Arma&quot;:         &quot;Espada&quot;,\n}\n\nfor key, value := range rangerRojo {\n  fmt.Println(&quot;Clave: &quot;, key, &quot; Valor: &quot;, value)\n}\n</code></pre>\n<p>Tenemos un <strong>map</strong> que tiene como <strong>claves</strong> varios strings representando las características de nuestro ranger y como <strong>valor</strong> he introducido algo que no habiamos visto todavia <strong>INTERFACE{}</strong>, bueno como resumen haceros a la idea de que es un tipo especial que funciona como un genérico, es decir, que representa cualquier valor(por eso podemos tener valores tipo <strong>INT</strong> y tipo <strong>STRING</strong>) y al recorrerlo tenemos esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.34.29.png\" alt=\"Range over Map\"><br>\n<span style=\"color:red\">OJO a tener en cuenta, no tiene porque hacerlo en orden sobretodo si introducimos algo a posteriori</span>, mirar un ejemplo:</p>\n<pre><code>rangerRojo := map[string]interface{}{\n  &quot;Fuerza&quot;:       10000,\n  &quot;Resistencia&quot;:  500,\n  &quot;Inteligencia&quot;: 150,\n  &quot;Arma&quot;:         &quot;Espada&quot;,\n}\n\nrangerRojo[&quot;Maná&quot;] = 150\n\nfor key, value := range rangerRojo {\n  fmt.Println(&quot;Clave: &quot;, key, &quot; Valor: &quot;, value)\n}\n</code></pre>\n<p>He añadido otra propiedad a nuestro ranger y el resultado es:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.39.11.png\" alt=\"First random range test\"></p>\n<p>Si lo ejecuto de nuevo:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.40.10.png\" alt=\"Second random range test\"></p>\n<p>Por último y como he adelantado en el ejemplo anterior:</p>\n<h2 id=\"aadirelementosanuestromap\">Añadir elementos a nuestro MAP</h2>\n<p>Bueno como ya hemos visto esto es muy sencillo:</p>\n<pre><code>rangerRojo[&quot;Maná&quot;] = 150\n\nfmt.Println(rangerRojo)\n</code></pre>\n<p>Y nos muestra<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.43.26.png\" alt=\"Print add content to map\"><br>\nPor el momento hemos terminado con los mapas, profundizaremos en el trabajo con ellos más adelante.<br>\nSin mucho más nos vemos en la siguiente superNinjas :)</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/go-go-power-ra-ah-que-no-go-parte-5-maps/","canonical_url":null,"uuid":"1dac295a-40d7-46d0-a459-2a33030577e4","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"35","reading_time":3,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Espero que este post sea bastante rápido jejejejej.<br>\nEn este caso hablaremos de los <strong>Maps</strong> o lo que en otros lenguajes conoceríamos como diccionario. En general siguen las mismas teorías que los <strong>arrays</strong> o los <strong>slices</strong> en cuanto a creación y a lo referente al rendimiento, los mapas crecen dinámicamente pero podemos indicarles el tamaño lo que optimizaría un poco su rendimiento.</p>\n<h1 id=\"creacin\">Creación</h1>\n<p>Empecemos con la creación. Como ya hemos visto en Go tenemos siempre varias formas de crear los elementos:</p>\n<ul>\n<li>Forma básica</li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">//var nombreVariable map[tipoClave]tipoValor\nvar rangerRojo map[string]int\n</code></pre></div>\n<ul>\n<li>Declaración corta:</li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">//Inicializando sin valores\nrangerRojo := map[string]int{}\n\n//Inicializando con valores. Obligatoria la coma ultima\nrangerVerde := map[string]int{\n \"Fuerza\": 10000,\n \"Resistencia\": 5000,\n}\n</code></pre></div>\n<ul>\n<li>Usando <strong>make</strong></li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangerVerde := make(map[string]int)\n//Al igual que en los arrays podemos indicar el tamaño para optimizar rendimiento.\nrangerNegro := make(map[string]int, 2)  \n</code></pre></div>\n<h1 id=\"usandomap\">Usando Map</h1>\n<p>Ya hemos visto un poco como es la creación de <strong>Maps</strong> en golang, no es muy complicado no?, veamos ahora algunos detalles de su uso.</p>\n<p>Cuando asignamos el valor, realmente este devuelve 2, el contenido que queremos sacar y si existe o no. Veamoslo con un ejemplo:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangerRojo := map[string]int{\n  \"Fuerza\": 10000,\n}\n\nrangerVerde := make(map[string]int)\n\npower, exist := rangerRojo[\"Fuerza\"]\nfmt.Println(\"Valor: \", power, \"Existe: \", exist)\n\npower2, exist2 := rangerVerde[\"Fuerza\"]\nfmt.Println(\"Valor: \", power2, \"Existe: \", exist2)\n</code></pre></div>\n<p>He usado dos formas de crear maps y el resultado de esto seria:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.08.38.png\" alt=\"Map Exist or Not\"><br>\nComo veis nos inicializa el valor como suele hacer Go y nos indica que no existe realmente.</p>\n<h2 id=\"borrandocontenidodeunmap\">Borrando contenido de un Map</h2>\n<p>En este caso Go se vuelve muy útil tiene una función propia para poder eliminar el elemento que queramos:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">delete(rangerRojo,\"Fuerza\")\n</code></pre></div>\n<p>Probémoslo en un ejemplo más completo:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangerRojo := map[string]int{\n\t\"Fuerza\":      10000,\n\t\"Resistencia\": 500,\n}\nfmt.Println(rangerRojo)\n\ndelete(rangerRojo, \"Fuerza\")\n\nfmt.Println(rangerRojo)\n</code></pre></div>\n<p>Y como vemos elimina el contenido sin problemas:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.16.50.png\" alt=\"Delete in Maps\"></p>\n<h2 id=\"recorrerunmap\">Recorrer un MAP</h2>\n<p>Para recorrer un MAP usamos la misma teoría que para los <strong>arrays</strong> o <strong>slices</strong>: <strong>RANGE</strong> vamos directos al ejemplo ya que es bastante simple:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangerRojo := map[string]interface{}{\n  \"Fuerza\":       10000,\n  \"Resistencia\":  500,\n  \"Inteligencia\": \"200\",\n  \"Arma\":         \"Espada\",\n}\n\nfor key, value := range rangerRojo {\n  fmt.Println(\"Clave: \", key, \" Valor: \", value)\n}\n</code></pre></div>\n<p>Tenemos un <strong>map</strong> que tiene como <strong>claves</strong> varios strings representando las características de nuestro ranger y como <strong>valor</strong> he introducido algo que no habiamos visto todavia <strong>INTERFACE{}</strong>, bueno como resumen haceros a la idea de que es un tipo especial que funciona como un genérico, es decir, que representa cualquier valor(por eso podemos tener valores tipo <strong>INT</strong> y tipo <strong>STRING</strong>) y al recorrerlo tenemos esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.34.29.png\" alt=\"Range over Map\"><br>\n<span style=\"color:red\">OJO a tener en cuenta, no tiene porque hacerlo en orden sobretodo si introducimos algo a posteriori</span>, mirar un ejemplo:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangerRojo := map[string]interface{}{\n  \"Fuerza\":       10000,\n  \"Resistencia\":  500,\n  \"Inteligencia\": 150,\n  \"Arma\":         \"Espada\",\n}\n\nrangerRojo[\"Maná\"] = 150\n\nfor key, value := range rangerRojo {\n  fmt.Println(\"Clave: \", key, \" Valor: \", value)\n}\n</code></pre></div>\n<p>He añadido otra propiedad a nuestro ranger y el resultado es:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.39.11.png\" alt=\"First random range test\"></p>\n<p>Si lo ejecuto de nuevo:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.40.10.png\" alt=\"Second random range test\"></p>\n<p>Por último y como he adelantado en el ejemplo anterior:</p>\n<h2 id=\"aadirelementosanuestromap\">Añadir elementos a nuestro MAP</h2>\n<p>Bueno como ya hemos visto esto es muy sencillo:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangerRojo[\"Maná\"] = 150\n\nfmt.Println(rangerRojo)\n</code></pre></div>\n<p>Y nos muestra<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.43.26.png\" alt=\"Print add content to map\"><br>\nPor el momento hemos terminado con los mapas, profundizaremos en el trabajo con ellos más adelante.<br>\nSin mucho más nos vemos en la siguiente superNinjas :)</p>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Espero que este post sea bastante rápido jejejejej."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEn este caso hablaremos de los "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Maps"}]},{"type":"text","value":" o lo que en otros lenguajes conoceríamos como diccionario. En general siguen las mismas teorías que los "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"arrays"}]},{"type":"text","value":" o los "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"slices"}]},{"type":"text","value":" en cuanto a creación y a lo referente al rendimiento, los mapas crecen dinámicamente pero podemos indicarles el tamaño lo que optimizaría un poco su rendimiento."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h1","properties":{"id":"creacin"},"children":[{"type":"text","value":"Creación"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Empecemos con la creación. Como ya hemos visto en Go tenemos siempre varias formas de crear los elementos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Forma básica"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//var nombreVariable map[tipoClave]tipoValor\nvar rangerRojo map[string]int\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Declaración corta:"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//Inicializando sin valores\nrangerRojo := map[string]int{}\n\n//Inicializando con valores. Obligatoria la coma ultima\nrangerVerde := map[string]int{\n \"Fuerza\": 10000,\n \"Resistencia\": 5000,\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Usando "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"make"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangerVerde := make(map[string]int)\n//Al igual que en los arrays podemos indicar el tamaño para optimizar rendimiento.\nrangerNegro := make(map[string]int, 2)  \n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h1","properties":{"id":"usandomap"},"children":[{"type":"text","value":"Usando Map"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ya hemos visto un poco como es la creación de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Maps"}]},{"type":"text","value":" en golang, no es muy complicado no?, veamos ahora algunos detalles de su uso."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Cuando asignamos el valor, realmente este devuelve 2, el contenido que queremos sacar y si existe o no. Veamoslo con un ejemplo:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangerRojo := map[string]int{\n  \"Fuerza\": 10000,\n}\n\nrangerVerde := make(map[string]int)\n\npower, exist := rangerRojo[\"Fuerza\"]\nfmt.Println(\"Valor: \", power, \"Existe: \", exist)\n\npower2, exist2 := rangerVerde[\"Fuerza\"]\nfmt.Println(\"Valor: \", power2, \"Existe: \", exist2)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"He usado dos formas de crear maps y el resultado de esto seria:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.08.38.png","alt":"Map Exist or Not"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nComo veis nos inicializa el valor como suele hacer Go y nos indica que no existe realmente."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"borrandocontenidodeunmap"},"children":[{"type":"text","value":"Borrando contenido de un Map"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En este caso Go se vuelve muy útil tiene una función propia para poder eliminar el elemento que queramos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"delete(rangerRojo,\"Fuerza\")\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Probémoslo en un ejemplo más completo:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangerRojo := map[string]int{\n\t\"Fuerza\":      10000,\n\t\"Resistencia\": 500,\n}\nfmt.Println(rangerRojo)\n\ndelete(rangerRojo, \"Fuerza\")\n\nfmt.Println(rangerRojo)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y como vemos elimina el contenido sin problemas:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.16.50.png","alt":"Delete in Maps"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"recorrerunmap"},"children":[{"type":"text","value":"Recorrer un MAP"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para recorrer un MAP usamos la misma teoría que para los "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"arrays"}]},{"type":"text","value":" o "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"slices"}]},{"type":"text","value":": "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"RANGE"}]},{"type":"text","value":" vamos directos al ejemplo ya que es bastante simple:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangerRojo := map[string]interface{}{\n  \"Fuerza\":       10000,\n  \"Resistencia\":  500,\n  \"Inteligencia\": \"200\",\n  \"Arma\":         \"Espada\",\n}\n\nfor key, value := range rangerRojo {\n  fmt.Println(\"Clave: \", key, \" Valor: \", value)\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tenemos un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"map"}]},{"type":"text","value":" que tiene como "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"claves"}]},{"type":"text","value":" varios strings representando las características de nuestro ranger y como "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"valor"}]},{"type":"text","value":" he introducido algo que no habiamos visto todavia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"INTERFACE{}"}]},{"type":"text","value":", bueno como resumen haceros a la idea de que es un tipo especial que funciona como un genérico, es decir, que representa cualquier valor(por eso podemos tener valores tipo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"INT"}]},{"type":"text","value":" y tipo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"STRING"}]},{"type":"text","value":") y al recorrerlo tenemos esto:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.34.29.png","alt":"Range over Map"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"style":"color:red"},"children":[{"type":"text","value":"OJO a tener en cuenta, no tiene porque hacerlo en orden sobretodo si introducimos algo a posteriori"}]},{"type":"text","value":", mirar un ejemplo:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangerRojo := map[string]interface{}{\n  \"Fuerza\":       10000,\n  \"Resistencia\":  500,\n  \"Inteligencia\": 150,\n  \"Arma\":         \"Espada\",\n}\n\nrangerRojo[\"Maná\"] = 150\n\nfor key, value := range rangerRojo {\n  fmt.Println(\"Clave: \", key, \" Valor: \", value)\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"He añadido otra propiedad a nuestro ranger y el resultado es:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.39.11.png","alt":"First random range test"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si lo ejecuto de nuevo:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.40.10.png","alt":"Second random range test"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Por último y como he adelantado en el ejemplo anterior:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"aadirelementosanuestromap"},"children":[{"type":"text","value":"Añadir elementos a nuestro MAP"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bueno como ya hemos visto esto es muy sencillo:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangerRojo[\"Maná\"] = 150\n\nfmt.Println(rangerRojo)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y nos muestra"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-20-at-21.43.26.png","alt":"Print add content to map"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nPor el momento hemos terminado con los mapas, profundizaremos en el trabajo con ellos más adelante."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nSin mucho más nos vemos en la siguiente superNinjas :)"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"creacin","heading":"Creación"},{"id":"usandomap","heading":"Usando Map","items":[{"id":"borrandocontenidodeunmap","heading":"Borrando contenido de un Map"},{"id":"recorrerunmap","heading":"Recorrer un MAP"},{"id":"aadirelementosanuestromap","heading":"Añadir elementos a nuestro MAP"}]}]},"featureImageSharp":{"base":"Untitled-2.png","publicURL":"/static/4c2a69b59a578389653f7d3cb966f439/Untitled-2.png","imageMeta":{"width":649,"height":244},"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABr0lEQVQoz22RPWhTURiGP+29N/eec3/aK1FjI9RBm3aSSBVBDVSzOGpwiMEhKopmsCnYyUVQwS5WxKU6iGBwdOrQqZOD+EO1HYo/mCBtySSC6+O5CQVjHF7ecw7veb6Xc0RrTa8USnV9S57ZZ2LF3rTqeBwqhiIf3++X9AO3YN11AlfGx7KKyTGX4nhXx/YJg9pGZBuOYxs5WJbVC1QdQBfm6oAwCnl+wWFixDMXPbZbGjulicx58dQko6MHKBQK5HK5jvL5/D8NDcz3NQOO4khGaJSElxXh4knFiaMZTh/22b/HwbYdpms1zpVKTNXrlMtlKpUK1Wq1v2ECVdrHPVPi+N0pns2eZ/7FNFdeP+FVY4a5xzfZcf8BA9fr7B4eZjCKSKfTZLNZ4jj+D9B1CXbuQu495OzaBt/ffWJh5RvF5m9azTbrq2tMfN1E5uZRQYhn8q7nkUql8Iz3ApN2QUAggly6xsjndRY32zz68J6Dtcs8ffuG280NrC9trOpVfJPTYdjzoX1vmEzVJmjfmEFaP5HlJoeWllhuzFJYXEA+tpAfv7Bu3enkkrz6i/EHdxf7UmCHE+cAAAAASUVORK5CYII=","aspectRatio":2.6515151515151514,"src":"/static/4c2a69b59a578389653f7d3cb966f439/d382d/Untitled-2.png","srcSet":"/static/4c2a69b59a578389653f7d3cb966f439/847ef/Untitled-2.png 175w,\n/static/4c2a69b59a578389653f7d3cb966f439/91cba/Untitled-2.png 350w,\n/static/4c2a69b59a578389653f7d3cb966f439/d382d/Untitled-2.png 649w","srcWebp":"/static/4c2a69b59a578389653f7d3cb966f439/10386/Untitled-2.webp","srcSetWebp":"/static/4c2a69b59a578389653f7d3cb966f439/9fca7/Untitled-2.webp 175w,\n/static/4c2a69b59a578389653f7d3cb966f439/37a4e/Untitled-2.webp 350w,\n/static/4c2a69b59a578389653f7d3cb966f439/10386/Untitled-2.webp 649w","sizes":"(max-width: 649px) 100vw, 649px"}}}}},{"node":{"id":"Ghost__Post__5a338158333e0f134c248f12","title":"Go Go Power Ra....ah que no: Go Parte 4 - Arrays y Slices II","slug":"go-parte-4-arrays-y-slices-ii","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Untitled-3.png","excerpt":"En este post vamos a ir viendo como se podrian hacer las cosas mas habituales\ncon los Arrays o Slices, como puede ser recorrerlos, veremos tambien como\npodemos pasar de uno a otro para la optimización, sin mucho mas empezamos.\n\nRecorrer un array o slice\nEmpecemos por el caso más habitual y es la necesidad de recorrer el contenido de\nun array, en este punto voy a adelantar alguna otra cosa que no es solo de Array\no Slices, pero creo que es mejor verlo en esta parte.\n\nPara recorrer un array, tipic","custom_excerpt":null,"visibility":"public","created_at_pretty":"12 Jul 2017","published_at_pretty":"18 Jul 2017","updated_at_pretty":"11 Oct 2017","created_at":"2017-07-12T08:39:33.000+02:00","published_at":"2017-07-18T21:19:48.000+02:00","updated_at":"2017-10-11T13:46:06.000+02:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":null}],"primary_author":{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":{"base":"Perfil.jpg","publicURL":"/static/b0de6281fb28a266510b3b09b9243e5a/Perfil.jpg","imageMeta":{"width":307,"height":307},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGzw6zC6zHn+cLYP//EAB0QAAICAQUAAAAAAAAAAAAAAAEDAAIEEyEiIzL/2gAIAQEAAQUCifca8KgcKWVfUpkHsG5pxX//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARARcQISIUFR/9oACAEBAAY/AhU88xkb7N06a8P/xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMUFRYXH/2gAIAQEAAT8hR2pq40aqb+xIAeXibhW9JXr8joF4TBcSNe0//9oADAMBAAIAAwAAABDzDwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFhcfD/2gAIAQEAAT8QyItrELaTlatLwU63MvEW6vUNdy4LZQDn7iVApV9VLtANdWwKkuYq4Er1VZ//2Q==","aspectRatio":1,"src":"/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg","srcSet":"/static/b0de6281fb28a266510b3b09b9243e5a/f340b/Perfil.jpg 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/22d64/Perfil.jpg 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/aa249/Perfil.jpg 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/0dc33/Perfil.jpg 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/60667/Perfil.jpg 307w","srcWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp","srcSetWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/59cda/Perfil.webp 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/7da75/Perfil.webp 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f282e/Perfil.webp 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/a7b21/Perfil.webp 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f59af/Perfil.webp 307w","sizes":"(max-width: 110px) 100vw, 110px"}}}},"primary_tag":{"slug":"go","url":"https://jlgarcia.fulldev.ninja/tag/go/","name":"Go","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null},"tags":[{"slug":"go","url":"https://jlgarcia.fulldev.ninja/tag/go/","name":"Go","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null},{"slug":"golang","url":"https://jlgarcia.fulldev.ninja/tag/golang/","name":"Golang","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null}],"plaintext":"En este post vamos a ir viendo como se podrian hacer las cosas mas habituales\ncon los Arrays o Slices, como puede ser recorrerlos, veremos tambien como\npodemos pasar de uno a otro para la optimización, sin mucho mas empezamos.\n\nRecorrer un array o slice\nEmpecemos por el caso más habitual y es la necesidad de recorrer el contenido de\nun array, en este punto voy a adelantar alguna otra cosa que no es solo de Array\no Slices, pero creo que es mejor verlo en esta parte.\n\nPara recorrer un array, tipicamente lo hacemos un bucle for, pues en este caso\nGo tiene un proceso muy similar específico (aunque se podria simular un for\nnormal, haciendo el código a mano pero me parece innecesario, con el código lo\nvereis mejor)\n\nrangers := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nfor index, ranger := range rangers {\n\tfmt.Println(\"El indice o posicion es: \", index)\n\tfmt.Println(\"El Ranger de esa posicion es:\", ranger)\n}\n\n\nCon un resultado similar a este:\n\nComo vemos aqui tenemos un par de palabras reservadas que no habiamos usado: for \ny range, mas o menos os podéis imaginar la funcion que tiene cada una,\nbásicamente esto quiere decir \"Por cada índice y ranger dentro del rango de\nrangers.....\"\n\nBastante sencillo no?? Si os fijais tenemos la declaración corta de variables :=\n, lo que esta haciendo es asignar en cada vuelta, el índice y el valor en los\nnombres de variables que hemos puesto(podrian ser otros perfectamente).\n\nY si no queremos el índice?? Básicamente ignoramos el resultado:\n\nfor _, ranger := range rangers {\n\tfmt.Println(\"El Ranger de esa posicion es:\", ranger)\n}\n\n\nEl _ en Go es un valor especial(funciona igual que en Swift por ejemplo) con el\nque estamos indicando que ignore ese resultado que podemos obtener de una\nfunción o cualquier otro proceso como puede ser este que acabamos de ver de\nrecorrer un array.\n\nSeparando un array\nO mas bien crear un subarray con parte del array original, es decir, veamos como\npartir un array para extrar el rango de posiciones que nos interese.\nEn go tenemos la posibilidad de seleccionar un rango de X posiciones dentro de\nun array, de una manera bastante sencilla:\n\nminiRangers := rangers[:2]\nfmt.Println(\"Hemos seleccionado del inicio a la posicion 2 sin incluirla:\")\nfmt.Println(miniRangers)\n\nminiRangers2 := rangers[2:4]\nfmt.Println(\"Hemos seleccionado desde la posicion 2 hasta la 4 sin incluirla:\")\nfmt.Println(miniRangers2)\n\nminiRangers3 := rangers[4:]\nfmt.Println(\"Hemos seleccionado desde la 4 hasta el final\")\nfmt.Println(miniRangers3)\n\n\n\n\nTambien es posible asignar al mismo array o resumiendo cortar el array:\n\nrangers := []string{\"Ranger Rosa\", \"Ranger Amarillo\", \"Ranger Rojo\", \"Ranger Verde\", \"Ranger Negro\"}\n\nrangers = rangers[2:4]\nfmt.Println(\"Hemos seleccionado del inicio a la posicion 2 sin incluirla:\")\nfmt.Println(rangers)\n\n\n\n\nTamaño y Capacidad\nEstos ya los hemos visto:\n\nfmt.Println(len(rangers))//Para el tamaño\n\nfmt.Println(len(rangers))//Capacidad\n\n\nAñadir\nTambien hemos visto como añadir, ya sea en un array hasta su tamaño designado y\nen un slice cuando no esta inicializado:\n\nvar rangersDesignados [2]string\nrangersDesignados = append(rangersDesignados,\"R.Rojo\",\"R.Verde\")\n\nrangersSlices = make([]string,2,10)\nappend(rangersSlices,\"R.Rojo\",\"R.Verde\")\n\n\nEliminar\nSiento decir que aqui el lenguaje nos falla un poco, ya que no ofrece ningun\nmétodo ya preparado para esto, como tal ya tenemos que jugar nosotros. En esta\npágina:SliceTricks [https://github.com/golang/go/wiki/SliceTricks]\nTenemos alguna forma de hacer las operaciones mas comunes de eliminar, cortar,\netc de manera eficiente.\n\nCopiar(Importante)\nEn un principio esto puede no parecer nada, estamos hablando de copiar un array\no slice en otro......bueno pues no es tan simple, ¿recordáis lo que comentamos\nen el post anterior sobre tamaño y capacidad? Por refrescar rápidamente, el \ntamaño era la cantidad de elementos que tenia un slice o array y la capacidad la\nreserva de elementos que puede contener, es decir, la cantidad máxima de\nelementos que puede tener. Recordemos que Go lo que hace es reservar un espacio\nen memoria para almacenar una cantidad aproximada de datos, lo importante venia\na la hora de aumentar, como tal el slice comentamos que al aumentar lo que hacia\nera reservarse el doble de la capacidad que tenia anteriormente. Esto con slices\npequeños esta muy bien, pero ¿y si tenemos un slice de 1000 elementos? En cuanto\nañadamos 1 más se reservara un espacio de 2000.\n\nPues bien con este escenario tenemos la accion de copiar como solución, lo que\nhacemos es copiar un array en otro con la capacidad ajustada a lo que queramos,\nla forma de usarlo es simple:\n\ncopy(destino, origen)\n\n\nBastante simple no? Pues veamos un ejemplo y apliquemos un poco de lógica para\noptimizar el consumo:\n\n//Creamos dos slices\nslice := []int{1, 2, 3, 4}\ncopia := make([]int, 4)\n\ncopy(copia, slice)\n\nfmt.Println(slice)\nfmt.Println(copia)\n\n\nComo vemos hemos creado un slice con la forma corta, con contenido, y otro vacio\ncon un tamaño y capacidad de 4. Si imprimimos el contenido todo estaría normal,\npero un detalle a tener en cuenta es que realmente copy tiene en cuenta la\ncapacidad del slice de destino (en este caso copia), como le hemos puesto una\ncapacidad de 4, nos copia todo el contenido. Pongamos un ejemplo si ponemos\nmenos:\n\n//Si cambiaramos copia con otra longitud\ncopia2 := make([]int, 2)\ncopy(copia2, slice)\nfmt.Println(slice)\nfmt.Println(copia2)\n//Veriamos como solo nos copia 2 elementos, \n\n\nLo mejor es controlar el tamaño(no la capacidad ojo), del slice origen y usar\neso para crear el destino:\n\n//para no equivocarnos lo ideal seria\ncopia3 := make([]int, len(slice))\ncopy(copia3, slice)\n\nfmt.Println(slice)\nfmt.Println(copia3)\n//Con esto si cambia el tamaño del slice la copia tambien.\n\n//Como buena practica, aunque segun el entorno, es añadir el doble del tamaño a la capacidad\ncopia4 := make([]int, len(slice), len(slice)*2) //O con la capacidad segun el caso\n    \ncopy(copia4, slice)\nfmt.Println(slice)\nfmt.Println(copia4)\n\n\nBueno creo que por el momento vamos a dejar los arrays y slices para continuar\ncon otras cosas, recordar mirar el link SliceTricks\n[https://github.com/golang/go/wiki/SliceTricks] y en otro de mis post tengo algo\nmas de trabajo con arrays: Go Tricks I\n[https://jlgarcia.fulldev.ninja/go-tricks-i-array-contains/]","html":"<!--kg-card-begin: markdown--><p>En este post vamos a ir viendo como se podrian hacer las cosas mas habituales con los Arrays o Slices, como puede ser recorrerlos, veremos tambien como podemos pasar de uno a otro para la optimización, sin mucho mas empezamos.</p>\n<h2 id=\"recorrerunarrayoslice\">Recorrer un array o slice</h2>\n<p>Empecemos por el caso más habitual y es la necesidad de recorrer el contenido de un array, en este punto voy a adelantar alguna otra cosa que no es solo de Array o Slices, pero creo que es mejor verlo en esta parte.</p>\n<p>Para recorrer un array, tipicamente lo hacemos un bucle <strong>for</strong>, pues en este caso Go tiene un proceso muy similar específico (aunque se podria simular un for normal, haciendo el código a mano pero me parece innecesario, con el código lo vereis mejor)</p>\n<pre><code>rangers := []string{&quot;Ranger Rosa&quot;, &quot;Ranger Amarillo&quot;}\n\nfor index, ranger := range rangers {\n\tfmt.Println(&quot;El indice o posicion es: &quot;, index)\n\tfmt.Println(&quot;El Ranger de esa posicion es:&quot;, ranger)\n}\n</code></pre>\n<p>Con un resultado similar a este:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen08.49.53.png\" alt=\"\"><br>\nComo vemos aqui tenemos un par de palabras reservadas que no habiamos usado: <strong>for</strong> y  <strong>range</strong>, mas o menos os podéis imaginar la funcion que tiene cada una, básicamente esto quiere decir &quot;Por cada índice y ranger dentro del rango de rangers.....&quot;</p>\n<p>Bastante sencillo no?? Si os fijais tenemos la declaración corta de variables <strong>:=</strong>, lo que esta haciendo es asignar en cada vuelta, el índice y el valor en los nombres de variables que hemos puesto(podrian ser otros perfectamente).</p>\n<p>Y si no queremos el índice?? Básicamente ignoramos el resultado:</p>\n<pre><code>for _, ranger := range rangers {\n\tfmt.Println(&quot;El Ranger de esa posicion es:&quot;, ranger)\n}\n</code></pre>\n<p>El <strong>_</strong> en Go es un valor especial(funciona igual que en Swift por ejemplo) con el que estamos indicando que ignore ese resultado que podemos obtener de una función o cualquier otro proceso como puede ser este que acabamos de ver de recorrer un array.</p>\n<h2 id=\"separandounarray\">Separando un array</h2>\n<p>O mas bien crear un subarray con parte del array original, es decir, veamos como partir un array para extrar el rango de posiciones que nos interese.<br>\nEn go tenemos la posibilidad de seleccionar un rango de X posiciones dentro de un array, de una manera bastante sencilla:</p>\n<pre><code>miniRangers := rangers[:2]\nfmt.Println(&quot;Hemos seleccionado del inicio a la posicion 2 sin incluirla:&quot;)\nfmt.Println(miniRangers)\n\nminiRangers2 := rangers[2:4]\nfmt.Println(&quot;Hemos seleccionado desde la posicion 2 hasta la 4 sin incluirla:&quot;)\nfmt.Println(miniRangers2)\n\nminiRangers3 := rangers[4:]\nfmt.Println(&quot;Hemos seleccionado desde la 4 hasta el final&quot;)\nfmt.Println(miniRangers3)\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen09.09.05.png\" alt=\"\"></p>\n<p>Tambien es posible asignar al mismo array o resumiendo cortar el array:</p>\n<pre><code>rangers := []string{&quot;Ranger Rosa&quot;, &quot;Ranger Amarillo&quot;, &quot;Ranger Rojo&quot;, &quot;Ranger Verde&quot;, &quot;Ranger Negro&quot;}\n\nrangers = rangers[2:4]\nfmt.Println(&quot;Hemos seleccionado del inicio a la posicion 2 sin incluirla:&quot;)\nfmt.Println(rangers)\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen09.12.15.png\" alt=\"\"></p>\n<h2 id=\"tamaoycapacidad\">Tamaño y Capacidad</h2>\n<p>Estos ya los hemos visto:</p>\n<pre><code>fmt.Println(len(rangers))//Para el tamaño\n\nfmt.Println(len(rangers))//Capacidad\n</code></pre>\n<h2 id=\"aadir\">Añadir</h2>\n<p>Tambien hemos visto como añadir, ya sea en un <strong>array</strong> hasta su tamaño designado y en un <strong>slice</strong> cuando no esta inicializado:</p>\n<pre><code>var rangersDesignados [2]string\nrangersDesignados = append(rangersDesignados,&quot;R.Rojo&quot;,&quot;R.Verde&quot;)\n\nrangersSlices = make([]string,2,10)\nappend(rangersSlices,&quot;R.Rojo&quot;,&quot;R.Verde&quot;)\n</code></pre>\n<h2 id=\"eliminar\">Eliminar</h2>\n<p>Siento decir que aqui el lenguaje nos falla un poco, ya que no ofrece ningun método ya preparado para esto, como tal ya tenemos que jugar nosotros. En esta página:<a href=\"https://github.com/golang/go/wiki/SliceTricks\">SliceTricks</a><br>\nTenemos alguna forma de hacer las operaciones mas comunes de eliminar, cortar, etc de manera eficiente.</p>\n<h2 id=\"copiarspanstylecolorredimportantespan\">Copiar<span style=\"color:red\">(Importante)</span></h2>\n<p>En un principio esto puede no parecer nada, estamos hablando de copiar un array o slice en otro......bueno pues no es tan simple, ¿recordáis lo que comentamos en el post anterior sobre tamaño y capacidad? Por refrescar rápidamente, el <strong>tamaño</strong> era la cantidad de elementos que tenia un slice o array y la <strong>capacidad</strong> la reserva de elementos que puede contener, es decir, la cantidad máxima de elementos que puede tener. Recordemos que Go lo que hace es reservar un espacio en memoria para almacenar una cantidad aproximada de datos, lo <span style=\"color:red\">importante</span> venia a la hora de aumentar, como tal el <strong>slice</strong> comentamos que al aumentar lo que hacia era reservarse el doble de la capacidad que tenia anteriormente. Esto con slices pequeños esta muy bien, pero ¿y si tenemos un slice de 1000 elementos? En cuanto añadamos 1 más se reservara un espacio de 2000.</p>\n<p>Pues bien con este escenario tenemos la accion de <span style=\"color:red\">copiar</span> como solución, lo que hacemos es copiar un array en otro con la capacidad ajustada a lo que queramos, la forma de usarlo es simple:</p>\n<pre><code>copy(destino, origen)\n</code></pre>\n<p>Bastante simple no? Pues veamos un ejemplo y apliquemos un poco de lógica para optimizar el consumo:</p>\n<pre><code>//Creamos dos slices\nslice := []int{1, 2, 3, 4}\ncopia := make([]int, 4)\n\ncopy(copia, slice)\n\nfmt.Println(slice)\nfmt.Println(copia)\n</code></pre>\n<p>Como vemos hemos creado un slice con la forma corta, con contenido, y otro vacio con un tamaño y capacidad de 4. Si imprimimos el contenido todo estaría normal, pero un detalle a tener en cuenta es que realmente <strong>copy</strong> tiene en cuenta la capacidad del slice de destino (en este caso copia), como le hemos puesto una capacidad de 4, nos copia todo el contenido. Pongamos un ejemplo si ponemos menos:</p>\n<pre><code>//Si cambiaramos copia con otra longitud\ncopia2 := make([]int, 2)\ncopy(copia2, slice)\nfmt.Println(slice)\nfmt.Println(copia2)\n//Veriamos como solo nos copia 2 elementos, \n</code></pre>\n<p>Lo mejor es controlar el tamaño(no la capacidad ojo), del slice origen y usar eso para crear el destino:</p>\n<pre><code>//para no equivocarnos lo ideal seria\ncopia3 := make([]int, len(slice))\ncopy(copia3, slice)\n\nfmt.Println(slice)\nfmt.Println(copia3)\n//Con esto si cambia el tamaño del slice la copia tambien.\n\n//Como buena practica, aunque segun el entorno, es añadir el doble del tamaño a la capacidad\ncopia4 := make([]int, len(slice), len(slice)*2) //O con la capacidad segun el caso\n    \ncopy(copia4, slice)\nfmt.Println(slice)\nfmt.Println(copia4)\n</code></pre>\n<p>Bueno creo que por el momento vamos a dejar los <strong>arrays</strong> y <strong>slices</strong> para continuar con otras cosas, recordar mirar el link <a href=\"https://github.com/golang/go/wiki/SliceTricks\">SliceTricks</a> y en otro de mis post tengo algo mas de trabajo con arrays: <a href=\"https://jlgarcia.fulldev.ninja/go-tricks-i-array-contains/\">Go Tricks I</a></p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/go-parte-4-arrays-y-slices-ii/","canonical_url":null,"uuid":"fcff7b39-793f-48db-b59d-161f6b0ea711","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"30","reading_time":5,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>En este post vamos a ir viendo como se podrian hacer las cosas mas habituales con los Arrays o Slices, como puede ser recorrerlos, veremos tambien como podemos pasar de uno a otro para la optimización, sin mucho mas empezamos.</p>\n<h2 id=\"recorrerunarrayoslice\">Recorrer un array o slice</h2>\n<p>Empecemos por el caso más habitual y es la necesidad de recorrer el contenido de un array, en este punto voy a adelantar alguna otra cosa que no es solo de Array o Slices, pero creo que es mejor verlo en esta parte.</p>\n<p>Para recorrer un array, tipicamente lo hacemos un bucle <strong>for</strong>, pues en este caso Go tiene un proceso muy similar específico (aunque se podria simular un for normal, haciendo el código a mano pero me parece innecesario, con el código lo vereis mejor)</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangers := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nfor index, ranger := range rangers {\n\tfmt.Println(\"El indice o posicion es: \", index)\n\tfmt.Println(\"El Ranger de esa posicion es:\", ranger)\n}\n</code></pre></div>\n<p>Con un resultado similar a este:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen08.49.53.png\" alt=\"\"><br>\nComo vemos aqui tenemos un par de palabras reservadas que no habiamos usado: <strong>for</strong> y  <strong>range</strong>, mas o menos os podéis imaginar la funcion que tiene cada una, básicamente esto quiere decir \"Por cada índice y ranger dentro del rango de rangers.....\"</p>\n<p>Bastante sencillo no?? Si os fijais tenemos la declaración corta de variables <strong>:=</strong>, lo que esta haciendo es asignar en cada vuelta, el índice y el valor en los nombres de variables que hemos puesto(podrian ser otros perfectamente).</p>\n<p>Y si no queremos el índice?? Básicamente ignoramos el resultado:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">for _, ranger := range rangers {\n\tfmt.Println(\"El Ranger de esa posicion es:\", ranger)\n}\n</code></pre></div>\n<p>El <strong>_</strong> en Go es un valor especial(funciona igual que en Swift por ejemplo) con el que estamos indicando que ignore ese resultado que podemos obtener de una función o cualquier otro proceso como puede ser este que acabamos de ver de recorrer un array.</p>\n<h2 id=\"separandounarray\">Separando un array</h2>\n<p>O mas bien crear un subarray con parte del array original, es decir, veamos como partir un array para extrar el rango de posiciones que nos interese.<br>\nEn go tenemos la posibilidad de seleccionar un rango de X posiciones dentro de un array, de una manera bastante sencilla:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">miniRangers := rangers[:2]\nfmt.Println(\"Hemos seleccionado del inicio a la posicion 2 sin incluirla:\")\nfmt.Println(miniRangers)\n\nminiRangers2 := rangers[2:4]\nfmt.Println(\"Hemos seleccionado desde la posicion 2 hasta la 4 sin incluirla:\")\nfmt.Println(miniRangers2)\n\nminiRangers3 := rangers[4:]\nfmt.Println(\"Hemos seleccionado desde la 4 hasta el final\")\nfmt.Println(miniRangers3)\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen09.09.05.png\" alt=\"\"></p>\n<p>Tambien es posible asignar al mismo array o resumiendo cortar el array:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rangers := []string{\"Ranger Rosa\", \"Ranger Amarillo\", \"Ranger Rojo\", \"Ranger Verde\", \"Ranger Negro\"}\n\nrangers = rangers[2:4]\nfmt.Println(\"Hemos seleccionado del inicio a la posicion 2 sin incluirla:\")\nfmt.Println(rangers)\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen09.12.15.png\" alt=\"\"></p>\n<h2 id=\"tamaoycapacidad\">Tamaño y Capacidad</h2>\n<p>Estos ya los hemos visto:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">fmt.Println(len(rangers))//Para el tamaño\n\nfmt.Println(len(rangers))//Capacidad\n</code></pre></div>\n<h2 id=\"aadir\">Añadir</h2>\n<p>Tambien hemos visto como añadir, ya sea en un <strong>array</strong> hasta su tamaño designado y en un <strong>slice</strong> cuando no esta inicializado:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">var rangersDesignados [2]string\nrangersDesignados = append(rangersDesignados,\"R.Rojo\",\"R.Verde\")\n\nrangersSlices = make([]string,2,10)\nappend(rangersSlices,\"R.Rojo\",\"R.Verde\")\n</code></pre></div>\n<h2 id=\"eliminar\">Eliminar</h2>\n<p>Siento decir que aqui el lenguaje nos falla un poco, ya que no ofrece ningun método ya preparado para esto, como tal ya tenemos que jugar nosotros. En esta página:<a href=\"https://github.com/golang/go/wiki/SliceTricks\">SliceTricks</a><br>\nTenemos alguna forma de hacer las operaciones mas comunes de eliminar, cortar, etc de manera eficiente.</p>\n<h2 id=\"copiarspanstylecolorredimportantespan\">Copiar<span style=\"color:red\">(Importante)</span></h2>\n<p>En un principio esto puede no parecer nada, estamos hablando de copiar un array o slice en otro......bueno pues no es tan simple, ¿recordáis lo que comentamos en el post anterior sobre tamaño y capacidad? Por refrescar rápidamente, el <strong>tamaño</strong> era la cantidad de elementos que tenia un slice o array y la <strong>capacidad</strong> la reserva de elementos que puede contener, es decir, la cantidad máxima de elementos que puede tener. Recordemos que Go lo que hace es reservar un espacio en memoria para almacenar una cantidad aproximada de datos, lo <span style=\"color:red\">importante</span> venia a la hora de aumentar, como tal el <strong>slice</strong> comentamos que al aumentar lo que hacia era reservarse el doble de la capacidad que tenia anteriormente. Esto con slices pequeños esta muy bien, pero ¿y si tenemos un slice de 1000 elementos? En cuanto añadamos 1 más se reservara un espacio de 2000.</p>\n<p>Pues bien con este escenario tenemos la accion de <span style=\"color:red\">copiar</span> como solución, lo que hacemos es copiar un array en otro con la capacidad ajustada a lo que queramos, la forma de usarlo es simple:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">copy(destino, origen)\n</code></pre></div>\n<p>Bastante simple no? Pues veamos un ejemplo y apliquemos un poco de lógica para optimizar el consumo:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">//Creamos dos slices\nslice := []int{1, 2, 3, 4}\ncopia := make([]int, 4)\n\ncopy(copia, slice)\n\nfmt.Println(slice)\nfmt.Println(copia)\n</code></pre></div>\n<p>Como vemos hemos creado un slice con la forma corta, con contenido, y otro vacio con un tamaño y capacidad de 4. Si imprimimos el contenido todo estaría normal, pero un detalle a tener en cuenta es que realmente <strong>copy</strong> tiene en cuenta la capacidad del slice de destino (en este caso copia), como le hemos puesto una capacidad de 4, nos copia todo el contenido. Pongamos un ejemplo si ponemos menos:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">//Si cambiaramos copia con otra longitud\ncopia2 := make([]int, 2)\ncopy(copia2, slice)\nfmt.Println(slice)\nfmt.Println(copia2)\n//Veriamos como solo nos copia 2 elementos, \n</code></pre></div>\n<p>Lo mejor es controlar el tamaño(no la capacidad ojo), del slice origen y usar eso para crear el destino:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">//para no equivocarnos lo ideal seria\ncopia3 := make([]int, len(slice))\ncopy(copia3, slice)\n\nfmt.Println(slice)\nfmt.Println(copia3)\n//Con esto si cambia el tamaño del slice la copia tambien.\n\n//Como buena practica, aunque segun el entorno, es añadir el doble del tamaño a la capacidad\ncopia4 := make([]int, len(slice), len(slice)*2) //O con la capacidad segun el caso\n    \ncopy(copia4, slice)\nfmt.Println(slice)\nfmt.Println(copia4)\n</code></pre></div>\n<p>Bueno creo que por el momento vamos a dejar los <strong>arrays</strong> y <strong>slices</strong> para continuar con otras cosas, recordar mirar el link <a href=\"https://github.com/golang/go/wiki/SliceTricks\">SliceTricks</a> y en otro de mis post tengo algo mas de trabajo con arrays: <a href=\"/go-tricks-i-array-contains/\">Go Tricks I</a></p>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En este post vamos a ir viendo como se podrian hacer las cosas mas habituales con los Arrays o Slices, como puede ser recorrerlos, veremos tambien como podemos pasar de uno a otro para la optimización, sin mucho mas empezamos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"recorrerunarrayoslice"},"children":[{"type":"text","value":"Recorrer un array o slice"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Empecemos por el caso más habitual y es la necesidad de recorrer el contenido de un array, en este punto voy a adelantar alguna otra cosa que no es solo de Array o Slices, pero creo que es mejor verlo en esta parte."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para recorrer un array, tipicamente lo hacemos un bucle "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"for"}]},{"type":"text","value":", pues en este caso Go tiene un proceso muy similar específico (aunque se podria simular un for normal, haciendo el código a mano pero me parece innecesario, con el código lo vereis mejor)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangers := []string{\"Ranger Rosa\", \"Ranger Amarillo\"}\n\nfor index, ranger := range rangers {\n\tfmt.Println(\"El indice o posicion es: \", index)\n\tfmt.Println(\"El Ranger de esa posicion es:\", ranger)\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Con un resultado similar a este:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen08.49.53.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nComo vemos aqui tenemos un par de palabras reservadas que no habiamos usado: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" y  "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"range"}]},{"type":"text","value":", mas o menos os podéis imaginar la funcion que tiene cada una, básicamente esto quiere decir \"Por cada índice y ranger dentro del rango de rangers.....\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bastante sencillo no?? Si os fijais tenemos la declaración corta de variables "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":":="}]},{"type":"text","value":", lo que esta haciendo es asignar en cada vuelta, el índice y el valor en los nombres de variables que hemos puesto(podrian ser otros perfectamente)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y si no queremos el índice?? Básicamente ignoramos el resultado:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for _, ranger := range rangers {\n\tfmt.Println(\"El Ranger de esa posicion es:\", ranger)\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"El "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"_"}]},{"type":"text","value":" en Go es un valor especial(funciona igual que en Swift por ejemplo) con el que estamos indicando que ignore ese resultado que podemos obtener de una función o cualquier otro proceso como puede ser este que acabamos de ver de recorrer un array."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"separandounarray"},"children":[{"type":"text","value":"Separando un array"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"O mas bien crear un subarray con parte del array original, es decir, veamos como partir un array para extrar el rango de posiciones que nos interese."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEn go tenemos la posibilidad de seleccionar un rango de X posiciones dentro de un array, de una manera bastante sencilla:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"miniRangers := rangers[:2]\nfmt.Println(\"Hemos seleccionado del inicio a la posicion 2 sin incluirla:\")\nfmt.Println(miniRangers)\n\nminiRangers2 := rangers[2:4]\nfmt.Println(\"Hemos seleccionado desde la posicion 2 hasta la 4 sin incluirla:\")\nfmt.Println(miniRangers2)\n\nminiRangers3 := rangers[4:]\nfmt.Println(\"Hemos seleccionado desde la 4 hasta el final\")\nfmt.Println(miniRangers3)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen09.09.05.png","alt":""},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tambien es posible asignar al mismo array o resumiendo cortar el array:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rangers := []string{\"Ranger Rosa\", \"Ranger Amarillo\", \"Ranger Rojo\", \"Ranger Verde\", \"Ranger Negro\"}\n\nrangers = rangers[2:4]\nfmt.Println(\"Hemos seleccionado del inicio a la posicion 2 sin incluirla:\")\nfmt.Println(rangers)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen09.12.15.png","alt":""},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"tamaoycapacidad"},"children":[{"type":"text","value":"Tamaño y Capacidad"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Estos ya los hemos visto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fmt.Println(len(rangers))//Para el tamaño\n\nfmt.Println(len(rangers))//Capacidad\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"aadir"},"children":[{"type":"text","value":"Añadir"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tambien hemos visto como añadir, ya sea en un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"array"}]},{"type":"text","value":" hasta su tamaño designado y en un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"slice"}]},{"type":"text","value":" cuando no esta inicializado:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"var rangersDesignados [2]string\nrangersDesignados = append(rangersDesignados,\"R.Rojo\",\"R.Verde\")\n\nrangersSlices = make([]string,2,10)\nappend(rangersSlices,\"R.Rojo\",\"R.Verde\")\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"eliminar"},"children":[{"type":"text","value":"Eliminar"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Siento decir que aqui el lenguaje nos falla un poco, ya que no ofrece ningun método ya preparado para esto, como tal ya tenemos que jugar nosotros. En esta página:"},{"type":"element","tagName":"a","properties":{"href":"https://github.com/golang/go/wiki/SliceTricks"},"children":[{"type":"text","value":"SliceTricks"}]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nTenemos alguna forma de hacer las operaciones mas comunes de eliminar, cortar, etc de manera eficiente."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"copiarspanstylecolorredimportantespan"},"children":[{"type":"text","value":"Copiar"},{"type":"element","tagName":"span","properties":{"style":"color:red"},"children":[{"type":"text","value":"(Importante)"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En un principio esto puede no parecer nada, estamos hablando de copiar un array o slice en otro......bueno pues no es tan simple, ¿recordáis lo que comentamos en el post anterior sobre tamaño y capacidad? Por refrescar rápidamente, el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tamaño"}]},{"type":"text","value":" era la cantidad de elementos que tenia un slice o array y la "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"capacidad"}]},{"type":"text","value":" la reserva de elementos que puede contener, es decir, la cantidad máxima de elementos que puede tener. Recordemos que Go lo que hace es reservar un espacio en memoria para almacenar una cantidad aproximada de datos, lo "},{"type":"element","tagName":"span","properties":{"style":"color:red"},"children":[{"type":"text","value":"importante"}]},{"type":"text","value":" venia a la hora de aumentar, como tal el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"slice"}]},{"type":"text","value":" comentamos que al aumentar lo que hacia era reservarse el doble de la capacidad que tenia anteriormente. Esto con slices pequeños esta muy bien, pero ¿y si tenemos un slice de 1000 elementos? En cuanto añadamos 1 más se reservara un espacio de 2000."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pues bien con este escenario tenemos la accion de "},{"type":"element","tagName":"span","properties":{"style":"color:red"},"children":[{"type":"text","value":"copiar"}]},{"type":"text","value":" como solución, lo que hacemos es copiar un array en otro con la capacidad ajustada a lo que queramos, la forma de usarlo es simple:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"copy(destino, origen)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bastante simple no? Pues veamos un ejemplo y apliquemos un poco de lógica para optimizar el consumo:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//Creamos dos slices\nslice := []int{1, 2, 3, 4}\ncopia := make([]int, 4)\n\ncopy(copia, slice)\n\nfmt.Println(slice)\nfmt.Println(copia)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como vemos hemos creado un slice con la forma corta, con contenido, y otro vacio con un tamaño y capacidad de 4. Si imprimimos el contenido todo estaría normal, pero un detalle a tener en cuenta es que realmente "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"copy"}]},{"type":"text","value":" tiene en cuenta la capacidad del slice de destino (en este caso copia), como le hemos puesto una capacidad de 4, nos copia todo el contenido. Pongamos un ejemplo si ponemos menos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//Si cambiaramos copia con otra longitud\ncopia2 := make([]int, 2)\ncopy(copia2, slice)\nfmt.Println(slice)\nfmt.Println(copia2)\n//Veriamos como solo nos copia 2 elementos, \n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo mejor es controlar el tamaño(no la capacidad ojo), del slice origen y usar eso para crear el destino:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//para no equivocarnos lo ideal seria\ncopia3 := make([]int, len(slice))\ncopy(copia3, slice)\n\nfmt.Println(slice)\nfmt.Println(copia3)\n//Con esto si cambia el tamaño del slice la copia tambien.\n\n//Como buena practica, aunque segun el entorno, es añadir el doble del tamaño a la capacidad\ncopia4 := make([]int, len(slice), len(slice)*2) //O con la capacidad segun el caso\n    \ncopy(copia4, slice)\nfmt.Println(slice)\nfmt.Println(copia4)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bueno creo que por el momento vamos a dejar los "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"arrays"}]},{"type":"text","value":" y "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"slices"}]},{"type":"text","value":" para continuar con otras cosas, recordar mirar el link "},{"type":"element","tagName":"a","properties":{"href":"https://github.com/golang/go/wiki/SliceTricks"},"children":[{"type":"text","value":"SliceTricks"}]},{"type":"text","value":" y en otro de mis post tengo algo mas de trabajo con arrays: "},{"type":"element","tagName":"a","properties":{"href":"/go-tricks-i-array-contains/"},"children":[{"type":"text","value":"Go Tricks I"}]}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"recorrerunarrayoslice","heading":"Recorrer un array o slice"},{"id":"separandounarray","heading":"Separando un array"},{"id":"tamaoycapacidad","heading":"Tamaño y Capacidad"},{"id":"aadir","heading":"Añadir"},{"id":"eliminar","heading":"Eliminar"},{"id":"copiarspanstylecolorredimportantespan","heading":"Copiar(Importante)"}]},"featureImageSharp":{"base":"Untitled-3.png","publicURL":"/static/4c2a69b59a578389653f7d3cb966f439/Untitled-3.png","imageMeta":{"width":649,"height":244},"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABr0lEQVQoz22RPWhTURiGP+29N/eec3/aK1FjI9RBm3aSSBVBDVSzOGpwiMEhKopmsCnYyUVQwS5WxKU6iGBwdOrQqZOD+EO1HYo/mCBtySSC6+O5CQVjHF7ecw7veb6Xc0RrTa8USnV9S57ZZ2LF3rTqeBwqhiIf3++X9AO3YN11AlfGx7KKyTGX4nhXx/YJg9pGZBuOYxs5WJbVC1QdQBfm6oAwCnl+wWFixDMXPbZbGjulicx58dQko6MHKBQK5HK5jvL5/D8NDcz3NQOO4khGaJSElxXh4knFiaMZTh/22b/HwbYdpms1zpVKTNXrlMtlKpUK1Wq1v2ECVdrHPVPi+N0pns2eZ/7FNFdeP+FVY4a5xzfZcf8BA9fr7B4eZjCKSKfTZLNZ4jj+D9B1CXbuQu495OzaBt/ffWJh5RvF5m9azTbrq2tMfN1E5uZRQYhn8q7nkUql8Iz3ApN2QUAggly6xsjndRY32zz68J6Dtcs8ffuG280NrC9trOpVfJPTYdjzoX1vmEzVJmjfmEFaP5HlJoeWllhuzFJYXEA+tpAfv7Bu3enkkrz6i/EHdxf7UmCHE+cAAAAASUVORK5CYII=","aspectRatio":2.6515151515151514,"src":"/static/4c2a69b59a578389653f7d3cb966f439/d382d/Untitled-3.png","srcSet":"/static/4c2a69b59a578389653f7d3cb966f439/847ef/Untitled-3.png 175w,\n/static/4c2a69b59a578389653f7d3cb966f439/91cba/Untitled-3.png 350w,\n/static/4c2a69b59a578389653f7d3cb966f439/d382d/Untitled-3.png 649w","srcWebp":"/static/4c2a69b59a578389653f7d3cb966f439/10386/Untitled-3.webp","srcSetWebp":"/static/4c2a69b59a578389653f7d3cb966f439/9fca7/Untitled-3.webp 175w,\n/static/4c2a69b59a578389653f7d3cb966f439/37a4e/Untitled-3.webp 350w,\n/static/4c2a69b59a578389653f7d3cb966f439/10386/Untitled-3.webp 649w","sizes":"(max-width: 649px) 100vw, 649px"}}}}},{"node":{"id":"Ghost__Post__5a338158333e0f134c248f14","title":"Go Tricks (I):  Array contains","slug":"go-tricks-i-array-contains","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Untitled-2.png","excerpt":"Comienzo sección nueva, en este caso son pequeños post que trataran sobre algún\ntruco para trabajar con Go, como todo existen varias formas de hacer, estas\nserán solo algunas posibles no siempre serán las mejores pero seguro que\nfuncionan ;)\n\nEn este primer post vamos a ver como comprobar si un elemento existe dentro de\nun array(o slice), lo veremos con strings pero puede ser con cualquier\ntipo(primitivo por lo menos)\n\nComo sabemos no tenemos forma directa en Go de comprobar si algo existe dentr","custom_excerpt":null,"visibility":"public","created_at_pretty":"12 Jul 2017","published_at_pretty":"13 Jul 2017","updated_at_pretty":"11 Oct 2017","created_at":"2017-07-12T21:09:31.000+02:00","published_at":"2017-07-13T11:00:34.000+02:00","updated_at":"2017-10-11T13:45:36.000+02:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":null}],"primary_author":{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":{"base":"Perfil.jpg","publicURL":"/static/b0de6281fb28a266510b3b09b9243e5a/Perfil.jpg","imageMeta":{"width":307,"height":307},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGzw6zC6zHn+cLYP//EAB0QAAICAQUAAAAAAAAAAAAAAAEDAAIEEyEiIzL/2gAIAQEAAQUCifca8KgcKWVfUpkHsG5pxX//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARARcQISIUFR/9oACAEBAAY/AhU88xkb7N06a8P/xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMUFRYXH/2gAIAQEAAT8hR2pq40aqb+xIAeXibhW9JXr8joF4TBcSNe0//9oADAMBAAIAAwAAABDzDwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFhcfD/2gAIAQEAAT8QyItrELaTlatLwU63MvEW6vUNdy4LZQDn7iVApV9VLtANdWwKkuYq4Er1VZ//2Q==","aspectRatio":1,"src":"/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg","srcSet":"/static/b0de6281fb28a266510b3b09b9243e5a/f340b/Perfil.jpg 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/22d64/Perfil.jpg 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/aa249/Perfil.jpg 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/0dc33/Perfil.jpg 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/60667/Perfil.jpg 307w","srcWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp","srcSetWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/59cda/Perfil.webp 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/7da75/Perfil.webp 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f282e/Perfil.webp 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/a7b21/Perfil.webp 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f59af/Perfil.webp 307w","sizes":"(max-width: 110px) 100vw, 110px"}}}},"primary_tag":{"slug":"go","url":"https://jlgarcia.fulldev.ninja/tag/go/","name":"Go","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null},"tags":[{"slug":"go","url":"https://jlgarcia.fulldev.ninja/tag/go/","name":"Go","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null},{"slug":"golang","url":"https://jlgarcia.fulldev.ninja/tag/golang/","name":"Golang","visibility":"public","feature_image":null,"description":null,"meta_title":"Golang Ninjas","meta_description":"Aprenderemos a usar el nuevo lenguaje de Google para backend desde lo más básico a temas avanzados como concurrencia o api rest.","featureImageSharp":null}],"plaintext":"Comienzo sección nueva, en este caso son pequeños post que trataran sobre algún\ntruco para trabajar con Go, como todo existen varias formas de hacer, estas\nserán solo algunas posibles no siempre serán las mejores pero seguro que\nfuncionan ;)\n\nEn este primer post vamos a ver como comprobar si un elemento existe dentro de\nun array(o slice), lo veremos con strings pero puede ser con cualquier\ntipo(primitivo por lo menos)\n\nComo sabemos no tenemos forma directa en Go de comprobar si algo existe dentro\nde un array por lo que debemos implementarlo nosotros.\nUna forma de hacerlo es la habitual de recorrer el array e ir comprobando pero\nrealmente tenemos un par de formas(mínimo) más que yo creo que pueden ser más\neficientes, aunque siempre depende del caso concreto.\n\nPrimera:\nVeamos una típica recorriendo el array\n\nlist := []string{\"a\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\nfor _, v := range list {\n if v == \"b\" {\t\t\t\t\t\n      fmt.Println(\"Existe\")\n      break\n }\n}\n\n\nMétodo bastante sencillo, recorremos el array y comprobamos si es lo que\nbuscamos, en cuanto lo encuetre salimos del for. Es bastante rápido la verdad.\n\nSegunda:\nlist := []string{\"a\", \"x\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\nset := make(map[string]bool)\n\nfor _, v := range list {\n   set[v] = true\n}\n\nfmt.Println(set[\"b\"])\n\n\nTenemos una array de strings desordenado, lo que hacemos es crear un map(lo que\nseria un diccionario en otros lenguajes), de clave=valor donde la clave es el\ncontenido del array, y como valor le he puesto true, para que cuando comprobemos\nque existe muestre un true(aunque eso pasaria con todos), es un poquito de\nazuquitar visual que hemos puesto. Realmente nos pasaria lo mismo si intentamos\nasignar el valor de forma corta, como tal recordar que los maps al asignarlos a\notra variable nueva devuelven realmente 2 valores, el contenido del map y si\nexiste o no.\n\nComo veis bastante sencillo, tenemos un for si o si pero es bastante rápido.\nFijaos que le he puesto el último valor con la idea de que al final haremos\npruebas de cuanto tarda cada uno.\n\nTercera:\nlist := []string{\"a\", \"x\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\nsort.Strings(list)\ni := sort.SearchStrings(list, \"b\")\n\nfmt.Println(list[i] == \"b\")\n\n\nLo primero que hacemos es ordenar el array y luego nos valemos del método \nSearchStrings(tiene search de todo) que tiene el objeto sort, le pasamos el\narray y lo que queremos buscar y nos devuelve la posición en la que se\nencuentra. A continuación comprobamos si el array tiene en la posición recibida\nel string que buscamos y voilá.\nOJO!! Hacemos la comprobación de list[i] == \"b\" porque el método SearchStrings\ndevuelve la posición donde deberiamos insertar el elemento en el caso de que no\nexista para que este ordenado directamente al añadirlo\n\nEsta forma a mi me gusta más pero en grandes cantidades de datos realmente\ntendriamos que probar su eficienca\n\nPruebas VERSUS\nVamos a ver la diferencia de lo que tarda cada uno, esto no es del todo válido\nya que depende de muchos factores pero es solo por ver lo que podria ser un\nacercamiento.\nVamos a crear un bucle rápido con cada tipo, que nos muestre el tiempo que ha\ntardado, pondremos unas 50 ejecuciones de cada uno para ver un poco la media,\npero siempre tener en cuenta que afecta la cantidad de código que tengamos un\nsimple Print puede alterar los valores:\n\nPrimer método\nj := 0\nfor {\n  t1 := time.Now()\n  list := []string{\"a\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \n\"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\t\nfor _, v := range list {\n  if v == \"b\" {\n    //Aqui podriamos hacer que muestre true o algo asi\n    \tbreak\n    }\n}\n\nfmt.Println(\"Tiempo total: \", time.Since(t1))\n\nif j == 50 {\n  break\n}\nj++\n\n\nSeguiremos la misma linea para los 3, creamos una especie de bucle while en el\nque cuando sea 50 la variable j se salga de la funcion.\nEsta nos daria algo parecido a esto:\n\nLa primera ejecución tarda un poco mas y luego se mantiene, muy rápido no??(el\narray es muy pequeño jejejejje)\n\nSegundo método:\nj := 0\n\nfor {\n  t1 := time.Now()\n  list := []string{\"a\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\nset := make(map[string]bool)\nfor _, v := range list {\n   set[v] = true\n}\n_ = set[\"b\"]\n\nfmt.Println(\"Tiempo total: \", time.Since(t1))\n\nif j == 50 {\n  break\n}\nj++\n\n\nNos da unos tiempos de este estilo\n\nBien aqui vemos que hemos bastante mas lentos en comparación, le he puesto el _\n= set[\"b\"] para simular que haciamos algo para comprobar.\nEste método tiene una ventaja, y es que si queremos buscar algo más ya lo\ntenemos en el map set. Como desventaja es que posiblemente consumamos recursos\ninnecesariamente.\n\nTercer Método:\nj := 0\n\nfor {\n  t1 := time.Now()\n  list := []string{\"a\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\n  sort.Strings(list)\n  i := sort.SearchStrings(list, \"b\")\n  _ = (list[i] == \"b\")\n  fmt.Println(\"Tiempo total: \", time.Since(t1))\n\nif j == 50 {\n  break\n}\nj++\n\n\nY con este ultimo obtenemos:\n\nVemos que es más rápido que el segundo pero menos que el primero. Como tal con\neste método si tenemos que realizar otra búsqueda como ya estaria ordenado seria\nmás rápida, he probado y salen unos tiempos como estos:\n\nComo veis llegamos a los nanosegundos, que no esta mal.\n\nAl final todo esto es orientativo, siempre dependerá del entorno y la cantidad\nde elementos que tenga el array. Es bastante probable que la primera forma sea\nla más rápida en la mayoría de los entornos pero al final deberemos valorarlo en\nel momento. También es cierto que es más fácil crearnos un método de utilidad\ncon la primera opción que con el resto, podríamos generalizar usando interface o\ncualquier cosa que se nos ocurra. Siendo esto bastante útil si pensamos en la\nconcurrencia como Go funciona con copias de elementos(a no ser que usemos\npunteros) no tendríamos \"condiciones de carrera\"(race conditions) a la hora de\nacceder a los elementos.\n\nEspero que os haya parecido interesante, nos vemos en el siguiente NINJA POST :)\n\nP.D: Para el que no sepa lo que es el race condition, básicamente es la\nposibilidad de que se este accediendo al mismo elemento y al mismo tiempo, lo\nque generaría varios problemas(cosa que en Go si trabajamos con copias no\ntendríamos)","html":"<!--kg-card-begin: markdown--><p>Comienzo sección nueva, en este caso son pequeños post que trataran sobre algún truco para trabajar con Go, como todo existen varias formas de hacer, estas serán solo algunas posibles no siempre serán las mejores pero seguro que funcionan ;)</p>\n<p>En este primer post vamos a ver como comprobar si un elemento existe dentro de un <strong>array(o slice)</strong>, lo veremos con strings pero puede ser con cualquier tipo(primitivo por lo menos)</p>\n<p>Como sabemos no tenemos forma directa en Go de comprobar si algo existe dentro de un array por lo que debemos implementarlo nosotros.<br>\nUna forma de hacerlo es la habitual de recorrer el array e ir comprobando pero realmente tenemos un par de formas(mínimo) más que yo creo que pueden ser más eficientes, aunque siempre depende del caso concreto.</p>\n<h3 id=\"primera\">Primera:</h3>\n<p>Veamos una típica recorriendo el array</p>\n<pre><code>list := []string{&quot;a&quot;, &quot;z&quot;, &quot;j&quot;, &quot;f&quot;, &quot;i&quot;, &quot;v&quot;, &quot;r&quot;, &quot;c&quot;, &quot;l&quot;, &quot;p&quot;, &quot;h&quot;, &quot;w&quot;, &quot;k&quot;, &quot;e&quot;, &quot;u&quot;, &quot;s&quot;, &quot;b&quot;}\n\nfor _, v := range list {\n if v == &quot;b&quot; {\t\t\t\t\t\n      fmt.Println(&quot;Existe&quot;)\n      break\n }\n}\n</code></pre>\n<p>Método bastante sencillo, recorremos el array y comprobamos si es lo que buscamos, en cuanto lo encuetre salimos del for. Es bastante rápido la verdad.</p>\n<h3 id=\"segunda\">Segunda:</h3>\n<pre><code>list := []string{&quot;a&quot;, &quot;x&quot;, &quot;z&quot;, &quot;j&quot;, &quot;f&quot;, &quot;i&quot;, &quot;v&quot;, &quot;r&quot;, &quot;c&quot;, &quot;l&quot;, &quot;p&quot;, &quot;h&quot;, &quot;w&quot;, &quot;k&quot;, &quot;e&quot;, &quot;u&quot;, &quot;s&quot;, &quot;b&quot;}\n\nset := make(map[string]bool)\n\nfor _, v := range list {\n   set[v] = true\n}\n\nfmt.Println(set[&quot;b&quot;])\n</code></pre>\n<p>Tenemos una array de strings desordenado, lo que hacemos es  crear un <strong>map</strong>(lo que seria un diccionario en otros lenguajes), de clave=valor donde la clave es el contenido del array, y como valor le he puesto true, para que cuando comprobemos que existe muestre un <strong>true</strong>(aunque eso pasaria con todos), es un poquito de azuquitar visual que hemos puesto. Realmente nos pasaria lo mismo si intentamos asignar el valor de forma corta, como tal recordar que los maps al asignarlos a otra variable nueva devuelven realmente 2 valores, el contenido del map y si existe o no.</p>\n<p>Como veis bastante sencillo, tenemos un for si o si pero es bastante rápido. Fijaos que le he puesto el último valor con la idea de que al final haremos pruebas de cuanto tarda cada uno.</p>\n<h3 id=\"tercera\">Tercera:</h3>\n<pre><code>list := []string{&quot;a&quot;, &quot;x&quot;, &quot;z&quot;, &quot;j&quot;, &quot;f&quot;, &quot;i&quot;, &quot;v&quot;, &quot;r&quot;, &quot;c&quot;, &quot;l&quot;, &quot;p&quot;, &quot;h&quot;, &quot;w&quot;, &quot;k&quot;, &quot;e&quot;, &quot;u&quot;, &quot;s&quot;, &quot;b&quot;}\n\nsort.Strings(list)\ni := sort.SearchStrings(list, &quot;b&quot;)\n\nfmt.Println(list[i] == &quot;b&quot;)\n</code></pre>\n<p>Lo primero que hacemos es ordenar el array y luego nos valemos del método <strong>SearchStrings</strong>(tiene search de todo) que tiene el objeto sort, le pasamos el array y lo que queremos buscar y nos devuelve la posición en la que se encuentra. A continuación comprobamos si el array tiene en la posición recibida el string que buscamos y voilá.<br>\n<strong>OJO!! Hacemos la comprobación de list[i] == &quot;b&quot; porque el método SearchStrings devuelve la posición donde deberiamos insertar el elemento en el caso de que no exista para que este ordenado directamente al añadirlo</strong></p>\n<p>Esta forma a mi me gusta más pero en grandes cantidades de datos realmente tendriamos que probar su eficienca</p>\n<h2 id=\"pruebasversus\">Pruebas VERSUS</h2>\n<p>Vamos a ver la diferencia de lo que tarda cada uno, esto no es del todo válido ya que depende de muchos factores pero es solo por ver lo que podria ser un acercamiento.<br>\nVamos a crear un bucle rápido con cada tipo, que nos muestre el tiempo que ha tardado, pondremos unas 50 ejecuciones de cada uno para ver un poco la media, pero siempre tener en cuenta que afecta la cantidad de código que tengamos un simple <strong>Print</strong> puede alterar los valores:</p>\n<h3 id=\"primermtodo\">Primer método</h3>\n<pre><code>j := 0\nfor {\n  t1 := time.Now()\n  list := []string{&quot;a&quot;, &quot;z&quot;, &quot;j&quot;, &quot;f&quot;, &quot;i&quot;, &quot;v&quot;, &quot;r&quot;, &quot;c&quot;, \n&quot;l&quot;, &quot;p&quot;, &quot;h&quot;, &quot;w&quot;, &quot;k&quot;, &quot;e&quot;, &quot;u&quot;, &quot;s&quot;, &quot;b&quot;}\n\t\nfor _, v := range list {\n  if v == &quot;b&quot; {\n    //Aqui podriamos hacer que muestre true o algo asi\n    \tbreak\n    }\n}\n\nfmt.Println(&quot;Tiempo total: &quot;, time.Since(t1))\n\nif j == 50 {\n  break\n}\nj++\n</code></pre>\n<p>Seguiremos la misma linea para los 3, creamos una especie de bucle while en el que cuando sea 50  la variable <strong>j</strong> se salga de la funcion.<br>\nEsta nos daria algo parecido a esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-13-at-09.07.51.png\" alt=\"\"><br>\nLa primera ejecución tarda un poco mas y luego se mantiene, muy rápido no??(el array es muy pequeño jejejejje)</p>\n<h3 id=\"segundomtodo\">Segundo método:</h3>\n<pre><code>j := 0\n\nfor {\n  t1 := time.Now()\n  list := []string{&quot;a&quot;, &quot;z&quot;, &quot;j&quot;, &quot;f&quot;, &quot;i&quot;, &quot;v&quot;, &quot;r&quot;, &quot;c&quot;, &quot;l&quot;, &quot;p&quot;, &quot;h&quot;, &quot;w&quot;, &quot;k&quot;, &quot;e&quot;, &quot;u&quot;, &quot;s&quot;, &quot;b&quot;}\n\nset := make(map[string]bool)\nfor _, v := range list {\n   set[v] = true\n}\n_ = set[&quot;b&quot;]\n\nfmt.Println(&quot;Tiempo total: &quot;, time.Since(t1))\n\nif j == 50 {\n  break\n}\nj++\n</code></pre>\n<p>Nos da unos tiempos de este estilo<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-13-at-09.12.25.png\" alt=\"\"><br>\nBien aqui vemos que hemos bastante mas lentos en comparación, le he puesto el <strong>_ = set[&quot;b&quot;]</strong> para simular que haciamos algo para comprobar.<br>\nEste método tiene una ventaja, y es que si queremos buscar algo más ya lo tenemos en el <strong>map</strong> set. Como desventaja es que posiblemente consumamos recursos innecesariamente.</p>\n<h3 id=\"tercermtodo\">Tercer Método:</h3>\n<pre><code>j := 0\n\nfor {\n  t1 := time.Now()\n  list := []string{&quot;a&quot;, &quot;z&quot;, &quot;j&quot;, &quot;f&quot;, &quot;i&quot;, &quot;v&quot;, &quot;r&quot;, &quot;c&quot;, &quot;l&quot;, &quot;p&quot;, &quot;h&quot;, &quot;w&quot;, &quot;k&quot;, &quot;e&quot;, &quot;u&quot;, &quot;s&quot;, &quot;b&quot;}\n\n  sort.Strings(list)\n  i := sort.SearchStrings(list, &quot;b&quot;)\n  _ = (list[i] == &quot;b&quot;)\n  fmt.Println(&quot;Tiempo total: &quot;, time.Since(t1))\n\nif j == 50 {\n  break\n}\nj++\n</code></pre>\n<p>Y con este ultimo obtenemos:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-13-at-09.18.12.png\" alt=\"\"><br>\nVemos que es más rápido que el segundo pero menos que el primero. Como tal con este método si tenemos que realizar otra búsqueda como ya estaria ordenado seria más rápida, he probado y salen unos tiempos como estos:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-13-at-09.20.45.png\" alt=\"\"><br>\nComo veis llegamos a los nanosegundos, que no esta mal.</p>\n<p>Al final todo esto es orientativo, siempre dependerá del entorno y la cantidad de elementos que tenga el array. Es bastante probable que la primera forma sea la más rápida en la mayoría de los entornos pero al final deberemos valorarlo en el momento. También es cierto que es más fácil crearnos un método de utilidad con la primera opción que con el resto, podríamos generalizar usando <strong>interface</strong> o cualquier cosa que se nos ocurra. Siendo esto bastante útil si pensamos en la concurrencia como Go funciona con copias de elementos(a no ser que usemos punteros) no tendríamos <em>&quot;condiciones de carrera&quot;</em>(race conditions) a la hora de acceder a los elementos.</p>\n<p>Espero que os haya parecido interesante, nos vemos en el siguiente NINJA POST :)</p>\n<p>P.D: Para el que no sepa lo que es el race condition, básicamente es la posibilidad de que se este accediendo al mismo elemento y al mismo tiempo, lo que generaría varios problemas(cosa que en Go si trabajamos con copias no tendríamos)</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/go-tricks-i-array-contains/","canonical_url":null,"uuid":"5cb27cd0-996d-4bc8-ae3c-d717d236f9a6","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"32","reading_time":6,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Comienzo sección nueva, en este caso son pequeños post que trataran sobre algún truco para trabajar con Go, como todo existen varias formas de hacer, estas serán solo algunas posibles no siempre serán las mejores pero seguro que funcionan ;)</p>\n<p>En este primer post vamos a ver como comprobar si un elemento existe dentro de un <strong>array(o slice)</strong>, lo veremos con strings pero puede ser con cualquier tipo(primitivo por lo menos)</p>\n<p>Como sabemos no tenemos forma directa en Go de comprobar si algo existe dentro de un array por lo que debemos implementarlo nosotros.<br>\nUna forma de hacerlo es la habitual de recorrer el array e ir comprobando pero realmente tenemos un par de formas(mínimo) más que yo creo que pueden ser más eficientes, aunque siempre depende del caso concreto.</p>\n<h3 id=\"primera\">Primera:</h3>\n<p>Veamos una típica recorriendo el array</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">list := []string{\"a\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\nfor _, v := range list {\n if v == \"b\" {\t\t\t\t\t\n      fmt.Println(\"Existe\")\n      break\n }\n}\n</code></pre></div>\n<p>Método bastante sencillo, recorremos el array y comprobamos si es lo que buscamos, en cuanto lo encuetre salimos del for. Es bastante rápido la verdad.</p>\n<h3 id=\"segunda\">Segunda:</h3>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">list := []string{\"a\", \"x\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\nset := make(map[string]bool)\n\nfor _, v := range list {\n   set[v] = true\n}\n\nfmt.Println(set[\"b\"])\n</code></pre></div>\n<p>Tenemos una array de strings desordenado, lo que hacemos es  crear un <strong>map</strong>(lo que seria un diccionario en otros lenguajes), de clave=valor donde la clave es el contenido del array, y como valor le he puesto true, para que cuando comprobemos que existe muestre un <strong>true</strong>(aunque eso pasaria con todos), es un poquito de azuquitar visual que hemos puesto. Realmente nos pasaria lo mismo si intentamos asignar el valor de forma corta, como tal recordar que los maps al asignarlos a otra variable nueva devuelven realmente 2 valores, el contenido del map y si existe o no.</p>\n<p>Como veis bastante sencillo, tenemos un for si o si pero es bastante rápido. Fijaos que le he puesto el último valor con la idea de que al final haremos pruebas de cuanto tarda cada uno.</p>\n<h3 id=\"tercera\">Tercera:</h3>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">list := []string{\"a\", \"x\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\nsort.Strings(list)\ni := sort.SearchStrings(list, \"b\")\n\nfmt.Println(list[i] == \"b\")\n</code></pre></div>\n<p>Lo primero que hacemos es ordenar el array y luego nos valemos del método <strong>SearchStrings</strong>(tiene search de todo) que tiene el objeto sort, le pasamos el array y lo que queremos buscar y nos devuelve la posición en la que se encuentra. A continuación comprobamos si el array tiene en la posición recibida el string que buscamos y voilá.<br>\n<strong>OJO!! Hacemos la comprobación de list[i] == \"b\" porque el método SearchStrings devuelve la posición donde deberiamos insertar el elemento en el caso de que no exista para que este ordenado directamente al añadirlo</strong></p>\n<p>Esta forma a mi me gusta más pero en grandes cantidades de datos realmente tendriamos que probar su eficienca</p>\n<h2 id=\"pruebasversus\">Pruebas VERSUS</h2>\n<p>Vamos a ver la diferencia de lo que tarda cada uno, esto no es del todo válido ya que depende de muchos factores pero es solo por ver lo que podria ser un acercamiento.<br>\nVamos a crear un bucle rápido con cada tipo, que nos muestre el tiempo que ha tardado, pondremos unas 50 ejecuciones de cada uno para ver un poco la media, pero siempre tener en cuenta que afecta la cantidad de código que tengamos un simple <strong>Print</strong> puede alterar los valores:</p>\n<h3 id=\"primermtodo\">Primer método</h3>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">j := 0\nfor {\n  t1 := time.Now()\n  list := []string{\"a\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \n\"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\t\nfor _, v := range list {\n  if v == \"b\" {\n    //Aqui podriamos hacer que muestre true o algo asi\n    \tbreak\n    }\n}\n\nfmt.Println(\"Tiempo total: \", time.Since(t1))\n\nif j == 50 {\n  break\n}\nj++\n</code></pre></div>\n<p>Seguiremos la misma linea para los 3, creamos una especie de bucle while en el que cuando sea 50  la variable <strong>j</strong> se salga de la funcion.<br>\nEsta nos daria algo parecido a esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-13-at-09.07.51.png\" alt=\"\"><br>\nLa primera ejecución tarda un poco mas y luego se mantiene, muy rápido no??(el array es muy pequeño jejejejje)</p>\n<h3 id=\"segundomtodo\">Segundo método:</h3>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">j := 0\n\nfor {\n  t1 := time.Now()\n  list := []string{\"a\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\nset := make(map[string]bool)\nfor _, v := range list {\n   set[v] = true\n}\n_ = set[\"b\"]\n\nfmt.Println(\"Tiempo total: \", time.Since(t1))\n\nif j == 50 {\n  break\n}\nj++\n</code></pre></div>\n<p>Nos da unos tiempos de este estilo<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-13-at-09.12.25.png\" alt=\"\"><br>\nBien aqui vemos que hemos bastante mas lentos en comparación, le he puesto el <strong>_ = set[\"b\"]</strong> para simular que haciamos algo para comprobar.<br>\nEste método tiene una ventaja, y es que si queremos buscar algo más ya lo tenemos en el <strong>map</strong> set. Como desventaja es que posiblemente consumamos recursos innecesariamente.</p>\n<h3 id=\"tercermtodo\">Tercer Método:</h3>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">j := 0\n\nfor {\n  t1 := time.Now()\n  list := []string{\"a\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\n  sort.Strings(list)\n  i := sort.SearchStrings(list, \"b\")\n  _ = (list[i] == \"b\")\n  fmt.Println(\"Tiempo total: \", time.Since(t1))\n\nif j == 50 {\n  break\n}\nj++\n</code></pre></div>\n<p>Y con este ultimo obtenemos:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-13-at-09.18.12.png\" alt=\"\"><br>\nVemos que es más rápido que el segundo pero menos que el primero. Como tal con este método si tenemos que realizar otra búsqueda como ya estaria ordenado seria más rápida, he probado y salen unos tiempos como estos:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-13-at-09.20.45.png\" alt=\"\"><br>\nComo veis llegamos a los nanosegundos, que no esta mal.</p>\n<p>Al final todo esto es orientativo, siempre dependerá del entorno y la cantidad de elementos que tenga el array. Es bastante probable que la primera forma sea la más rápida en la mayoría de los entornos pero al final deberemos valorarlo en el momento. También es cierto que es más fácil crearnos un método de utilidad con la primera opción que con el resto, podríamos generalizar usando <strong>interface</strong> o cualquier cosa que se nos ocurra. Siendo esto bastante útil si pensamos en la concurrencia como Go funciona con copias de elementos(a no ser que usemos punteros) no tendríamos <em>\"condiciones de carrera\"</em>(race conditions) a la hora de acceder a los elementos.</p>\n<p>Espero que os haya parecido interesante, nos vemos en el siguiente NINJA POST :)</p>\n<p>P.D: Para el que no sepa lo que es el race condition, básicamente es la posibilidad de que se este accediendo al mismo elemento y al mismo tiempo, lo que generaría varios problemas(cosa que en Go si trabajamos con copias no tendríamos)</p>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Comienzo sección nueva, en este caso son pequeños post que trataran sobre algún truco para trabajar con Go, como todo existen varias formas de hacer, estas serán solo algunas posibles no siempre serán las mejores pero seguro que funcionan ;)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En este primer post vamos a ver como comprobar si un elemento existe dentro de un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"array(o slice)"}]},{"type":"text","value":", lo veremos con strings pero puede ser con cualquier tipo(primitivo por lo menos)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como sabemos no tenemos forma directa en Go de comprobar si algo existe dentro de un array por lo que debemos implementarlo nosotros."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nUna forma de hacerlo es la habitual de recorrer el array e ir comprobando pero realmente tenemos un par de formas(mínimo) más que yo creo que pueden ser más eficientes, aunque siempre depende del caso concreto."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"primera"},"children":[{"type":"text","value":"Primera:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos una típica recorriendo el array"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"list := []string{\"a\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\nfor _, v := range list {\n if v == \"b\" {\t\t\t\t\t\n      fmt.Println(\"Existe\")\n      break\n }\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Método bastante sencillo, recorremos el array y comprobamos si es lo que buscamos, en cuanto lo encuetre salimos del for. Es bastante rápido la verdad."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"segunda"},"children":[{"type":"text","value":"Segunda:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"list := []string{\"a\", \"x\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\nset := make(map[string]bool)\n\nfor _, v := range list {\n   set[v] = true\n}\n\nfmt.Println(set[\"b\"])\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tenemos una array de strings desordenado, lo que hacemos es  crear un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"map"}]},{"type":"text","value":"(lo que seria un diccionario en otros lenguajes), de clave=valor donde la clave es el contenido del array, y como valor le he puesto true, para que cuando comprobemos que existe muestre un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"true"}]},{"type":"text","value":"(aunque eso pasaria con todos), es un poquito de azuquitar visual que hemos puesto. Realmente nos pasaria lo mismo si intentamos asignar el valor de forma corta, como tal recordar que los maps al asignarlos a otra variable nueva devuelven realmente 2 valores, el contenido del map y si existe o no."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como veis bastante sencillo, tenemos un for si o si pero es bastante rápido. Fijaos que le he puesto el último valor con la idea de que al final haremos pruebas de cuanto tarda cada uno."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"tercera"},"children":[{"type":"text","value":"Tercera:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"list := []string{\"a\", \"x\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\nsort.Strings(list)\ni := sort.SearchStrings(list, \"b\")\n\nfmt.Println(list[i] == \"b\")\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo primero que hacemos es ordenar el array y luego nos valemos del método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"SearchStrings"}]},{"type":"text","value":"(tiene search de todo) que tiene el objeto sort, le pasamos el array y lo que queremos buscar y nos devuelve la posición en la que se encuentra. A continuación comprobamos si el array tiene en la posición recibida el string que buscamos y voilá."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"OJO!! Hacemos la comprobación de list[i] == \"b\" porque el método SearchStrings devuelve la posición donde deberiamos insertar el elemento en el caso de que no exista para que este ordenado directamente al añadirlo"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esta forma a mi me gusta más pero en grandes cantidades de datos realmente tendriamos que probar su eficienca"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"pruebasversus"},"children":[{"type":"text","value":"Pruebas VERSUS"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vamos a ver la diferencia de lo que tarda cada uno, esto no es del todo válido ya que depende de muchos factores pero es solo por ver lo que podria ser un acercamiento."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nVamos a crear un bucle rápido con cada tipo, que nos muestre el tiempo que ha tardado, pondremos unas 50 ejecuciones de cada uno para ver un poco la media, pero siempre tener en cuenta que afecta la cantidad de código que tengamos un simple "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Print"}]},{"type":"text","value":" puede alterar los valores:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"primermtodo"},"children":[{"type":"text","value":"Primer método"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"j := 0\nfor {\n  t1 := time.Now()\n  list := []string{\"a\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \n\"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\t\nfor _, v := range list {\n  if v == \"b\" {\n    //Aqui podriamos hacer que muestre true o algo asi\n    \tbreak\n    }\n}\n\nfmt.Println(\"Tiempo total: \", time.Since(t1))\n\nif j == 50 {\n  break\n}\nj++\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seguiremos la misma linea para los 3, creamos una especie de bucle while en el que cuando sea 50  la variable "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"j"}]},{"type":"text","value":" se salga de la funcion."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEsta nos daria algo parecido a esto:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-13-at-09.07.51.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nLa primera ejecución tarda un poco mas y luego se mantiene, muy rápido no??(el array es muy pequeño jejejejje)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"segundomtodo"},"children":[{"type":"text","value":"Segundo método:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"j := 0\n\nfor {\n  t1 := time.Now()\n  list := []string{\"a\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\nset := make(map[string]bool)\nfor _, v := range list {\n   set[v] = true\n}\n_ = set[\"b\"]\n\nfmt.Println(\"Tiempo total: \", time.Since(t1))\n\nif j == 50 {\n  break\n}\nj++\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nos da unos tiempos de este estilo"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-13-at-09.12.25.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nBien aqui vemos que hemos bastante mas lentos en comparación, le he puesto el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"_ = set[\"b\"]"}]},{"type":"text","value":" para simular que haciamos algo para comprobar."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEste método tiene una ventaja, y es que si queremos buscar algo más ya lo tenemos en el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"map"}]},{"type":"text","value":" set. Como desventaja es que posiblemente consumamos recursos innecesariamente."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"tercermtodo"},"children":[{"type":"text","value":"Tercer Método:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"j := 0\n\nfor {\n  t1 := time.Now()\n  list := []string{\"a\", \"z\", \"j\", \"f\", \"i\", \"v\", \"r\", \"c\", \"l\", \"p\", \"h\", \"w\", \"k\", \"e\", \"u\", \"s\", \"b\"}\n\n  sort.Strings(list)\n  i := sort.SearchStrings(list, \"b\")\n  _ = (list[i] == \"b\")\n  fmt.Println(\"Tiempo total: \", time.Since(t1))\n\nif j == 50 {\n  break\n}\nj++\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y con este ultimo obtenemos:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-13-at-09.18.12.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nVemos que es más rápido que el segundo pero menos que el primero. Como tal con este método si tenemos que realizar otra búsqueda como ya estaria ordenado seria más rápida, he probado y salen unos tiempos como estos:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-13-at-09.20.45.png","alt":""},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nComo veis llegamos a los nanosegundos, que no esta mal."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Al final todo esto es orientativo, siempre dependerá del entorno y la cantidad de elementos que tenga el array. Es bastante probable que la primera forma sea la más rápida en la mayoría de los entornos pero al final deberemos valorarlo en el momento. También es cierto que es más fácil crearnos un método de utilidad con la primera opción que con el resto, podríamos generalizar usando "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"interface"}]},{"type":"text","value":" o cualquier cosa que se nos ocurra. Siendo esto bastante útil si pensamos en la concurrencia como Go funciona con copias de elementos(a no ser que usemos punteros) no tendríamos "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"\"condiciones de carrera\""}]},{"type":"text","value":"(race conditions) a la hora de acceder a los elementos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Espero que os haya parecido interesante, nos vemos en el siguiente NINJA POST :)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"P.D: Para el que no sepa lo que es el race condition, básicamente es la posibilidad de que se este accediendo al mismo elemento y al mismo tiempo, lo que generaría varios problemas(cosa que en Go si trabajamos con copias no tendríamos)"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"primera","heading":"Primera:"},{"id":"segunda","heading":"Segunda:"},{"id":"tercera","heading":"Tercera:"},{"id":"pruebasversus","heading":"Pruebas VERSUS","items":[{"id":"primermtodo","heading":"Primer método"},{"id":"segundomtodo","heading":"Segundo método:"},{"id":"tercermtodo","heading":"Tercer Método:"}]}]},"featureImageSharp":{"base":"Untitled-2.png","publicURL":"/static/4c2a69b59a578389653f7d3cb966f439/Untitled-2.png","imageMeta":{"width":649,"height":244},"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABr0lEQVQoz22RPWhTURiGP+29N/eec3/aK1FjI9RBm3aSSBVBDVSzOGpwiMEhKopmsCnYyUVQwS5WxKU6iGBwdOrQqZOD+EO1HYo/mCBtySSC6+O5CQVjHF7ecw7veb6Xc0RrTa8USnV9S57ZZ2LF3rTqeBwqhiIf3++X9AO3YN11AlfGx7KKyTGX4nhXx/YJg9pGZBuOYxs5WJbVC1QdQBfm6oAwCnl+wWFixDMXPbZbGjulicx58dQko6MHKBQK5HK5jvL5/D8NDcz3NQOO4khGaJSElxXh4knFiaMZTh/22b/HwbYdpms1zpVKTNXrlMtlKpUK1Wq1v2ECVdrHPVPi+N0pns2eZ/7FNFdeP+FVY4a5xzfZcf8BA9fr7B4eZjCKSKfTZLNZ4jj+D9B1CXbuQu495OzaBt/ffWJh5RvF5m9azTbrq2tMfN1E5uZRQYhn8q7nkUql8Iz3ApN2QUAggly6xsjndRY32zz68J6Dtcs8ffuG280NrC9trOpVfJPTYdjzoX1vmEzVJmjfmEFaP5HlJoeWllhuzFJYXEA+tpAfv7Bu3enkkrz6i/EHdxf7UmCHE+cAAAAASUVORK5CYII=","aspectRatio":2.6515151515151514,"src":"/static/4c2a69b59a578389653f7d3cb966f439/d382d/Untitled-2.png","srcSet":"/static/4c2a69b59a578389653f7d3cb966f439/847ef/Untitled-2.png 175w,\n/static/4c2a69b59a578389653f7d3cb966f439/91cba/Untitled-2.png 350w,\n/static/4c2a69b59a578389653f7d3cb966f439/d382d/Untitled-2.png 649w","srcWebp":"/static/4c2a69b59a578389653f7d3cb966f439/10386/Untitled-2.webp","srcSetWebp":"/static/4c2a69b59a578389653f7d3cb966f439/9fca7/Untitled-2.webp 175w,\n/static/4c2a69b59a578389653f7d3cb966f439/37a4e/Untitled-2.webp 350w,\n/static/4c2a69b59a578389653f7d3cb966f439/10386/Untitled-2.webp 649w","sizes":"(max-width: 649px) 100vw, 649px"}}}}}]}},"pageContext":{"slug":"go-go-power-ra-go-parte-2-el-lenguaje-variables-tipos-primitivos","prev":"go-go-power-ra-ah-que-no-go-parte-3-arrays-y-slices-i","next":"go-go-power-ra-ah-que-no-go-parte1-intro-y-preparacion","tag":"go","limit":3,"skip":0,"primaryTagCount":6,"collectionPaths":{}}},
    "staticQueryHashes": ["1272700106","1676991999","2138873178","2546165603","2681841279","2938721187","293880488","3052966952","4156497161"]}