<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Roberto Morais</title>
    <description>The latest articles on DEV Community by Roberto Morais (@fuenrob).</description>
    <link>https://dev.to/fuenrob</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F362859%2F12e9a8d3-549d-4b5e-9553-c4c90443f4e1.jpg</url>
      <title>DEV Community: Roberto Morais</title>
      <link>https://dev.to/fuenrob</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fuenrob"/>
    <language>en</language>
    <item>
      <title>Cómo Go implementa goroutines y qué pasa bajo el capó</title>
      <dc:creator>Roberto Morais</dc:creator>
      <pubDate>Wed, 16 Jul 2025 18:00:00 +0000</pubDate>
      <link>https://dev.to/fuenrob/como-go-implementa-goroutines-y-que-pasa-bajo-el-capo-24n9</link>
      <guid>https://dev.to/fuenrob/como-go-implementa-goroutines-y-que-pasa-bajo-el-capo-24n9</guid>
      <description>&lt;p&gt;¡Hola, colegas Go-geeks! 🚀&lt;/p&gt;

&lt;p&gt;En este artículo vamos a destripar el pilar de la concurrencia en Go: &lt;strong&gt;las goroutines&lt;/strong&gt;. Mucho se habla de lo fáciles que son de usar, pero… ¿qué sucede realmente cuando escribes &lt;code&gt;go f()&lt;/code&gt;? ¿Cómo gestiona Go miles (¡o millones!) de esas “ligeras” hebras sin petar el sistema operativo?  &lt;/p&gt;

&lt;p&gt;Veremos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;El modelo M:N de goroutines vs. hilos OS.&lt;/li&gt;
&lt;li&gt;Las estructuras internas: &lt;strong&gt;G&lt;/strong&gt;, &lt;strong&gt;M&lt;/strong&gt; y &lt;strong&gt;P&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;El scheduler: work-stealing, parking/unparking.&lt;/li&gt;
&lt;li&gt;Costes reales y ejemplos de benchmark.&lt;/li&gt;
&lt;li&gt;Consejos prácticos y recomendaciones.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. ¿Por qué goroutines y no hilos “a pelo”?
&lt;/h2&gt;

&lt;p&gt;En lenguajes tradicionales (Java, C++), cada hilo OS consume decenas de kilobytes o más de stack, y el cambio de contexto es caro. Go introdujo en 2009 un modelo más ligero:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Goroutine&lt;/strong&gt;: hebra del lenguaje, con un stack inicial de apenas 2 KB (que crece y decrece dinámicamente).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hilo OS&lt;/strong&gt;: recurso del sistema que maneja la ejecución real en CPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scheduler M:N&lt;/strong&gt;: multiplexa M hilos OS para ejecutar N goroutines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esta capa intermedia permite lanzar &lt;strong&gt;miles&lt;/strong&gt; de goroutines sin arruinar tu RAM o explotar el scheduler del kernel.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. G, M y P: las tres siglas mágicas
&lt;/h2&gt;

&lt;p&gt;El runtime de Go gira alrededor de tres estructuras clave:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Símbolo&lt;/th&gt;
&lt;th&gt;Nombre&lt;/th&gt;
&lt;th&gt;Rol principal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;G&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Goroutine&lt;/td&gt;
&lt;td&gt;Contiene estado de la goroutine: stack, programa, args.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Machine (hilo OS)&lt;/td&gt;
&lt;td&gt;Representa un hilo del sistema operativo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;P&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Processor (contexto)&lt;/td&gt;
&lt;td&gt;Guarda la “capacidad de ejecutar”: una cola de G listos.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;G (goroutine)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estructura &lt;code&gt;runtime.g&lt;/code&gt;: puntero al PC, stack, estado (running, runnable, waiting…).
&lt;/li&gt;
&lt;li&gt;Stack dinámico: empieza en ~2 KB y se expande hasta varios MB si hay recursión profunda.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;M (machine)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estructura &lt;code&gt;runtime.m&lt;/code&gt;: mapea a un hilo real del SO.
&lt;/li&gt;
&lt;li&gt;Cada M puede ejecutar cero o una P a la vez.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;P (processor)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estructura &lt;code&gt;runtime.p&lt;/code&gt;: puente entre G y M.
&lt;/li&gt;
&lt;li&gt;Contiene una cola local de goroutines (&lt;code&gt;runqueue&lt;/code&gt;) y acceso a la cola global.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cuando arranca tu programa, Go crea &lt;code&gt;GOMAXPROCS&lt;/code&gt; Ps (por defecto igual al número de CPUs), y un pool inicial de Ms crece o desciende según la carga.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. El corazón del scheduler M:N
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 Asignación de G a M vía P
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Una nueva goroutine se inserta en la cola local de la P que la lanzó.&lt;/li&gt;
&lt;li&gt;Si la P está siendo ejecutada por un M, éste saca una G de su cola y la ejecuta.&lt;/li&gt;
&lt;li&gt;Cuando la cola local se vacía, la P “roba” trabajo de otras Ps (work-stealing) o de la cola global.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3.2 Work-stealing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cada P mantiene un array circular de tamaño fijo (256) para su cola local.&lt;/li&gt;
&lt;li&gt;Si tu P no tiene Gs, revisa &lt;strong&gt;otra&lt;/strong&gt; P (aleatoria o en ronda) para “robar” la mitad de su cola.&lt;/li&gt;
&lt;li&gt;Esto equilibra la carga sin necesidad de bloqueo global casi siempre.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.3 Parking y unparking
&lt;/h3&gt;

&lt;p&gt;Cuando una G se bloquea (por ejemplo, lectura de canal, bloqueo en syscall, sleep):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Se marca como &lt;strong&gt;waiting&lt;/strong&gt; y se mueve a la cola de espera adecuada.
&lt;/li&gt;
&lt;li&gt;El M que la ejecutaba “desvincula” la P y busca otra P con trabajo o crea una nueva M si no hay Ps libres y estamos bajo el límite.
&lt;/li&gt;
&lt;li&gt;Cuando el evento (IO, timer, canal) se dispara, la G se re-activa: va a la cola del P que la despierte (a veces la global).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  4. Consejos prácticos y “gotchas” de rendimiento
&lt;/h2&gt;

&lt;p&gt;Evita goroutines “huérfanas”: siempre acompáñalas de un contexto o WaitGroup, o acaban vivas consumiendo memoria.&lt;/p&gt;

&lt;p&gt;No blockees tu P: llamadas de bloqueo largas (ej. IO sin usar el paquete net/http de Go) pueden consumir un M completo; mejor usa las primitivas del runtime o goroutines dedicadas.&lt;/p&gt;

&lt;p&gt;Tweak de GOMAXPROCS: por defecto vale runtime.NumCPU(). Jugar con este valor puede mejorar throughput en programas IO-bound vs CPU-bound.&lt;/p&gt;

&lt;p&gt;Perfilado: usa go test -bench y pprof para ver cuántas goroutines están vivas y analizar cuellos de botella.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Las goroutines no son magia negra, sino el resultado de un diseño cuidadoso en el runtime de Go.&lt;br&gt;
Con un scheduler M:N, work-stealing y stacks dinámicos, Go te permite escribir código concurrente simple y eficiente sin renunciar al rendimiento.&lt;/p&gt;

&lt;p&gt;Si te ha molado el viaje al interior del runtime, ¡dale ❤️, comenta tus dudas y comparte tus propios benchmarks! Y, por supuesto, sigue explorando: el recolector de basura, el modelo de memoria y el linker de Go tienen aún más secretos por descubrir.&lt;/p&gt;



&lt;p&gt;Si prefieres un soporte visual, por aquí te dejo un video hablando de la concurrencia en Go:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/c8FeQxeEkpA"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;¡Nos leemos en el próximo artículo! 👋&lt;/p&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>goroutines</category>
    </item>
    <item>
      <title>🚀 Buenas prácticas de caching en Go para APIs rápidas y eficientes</title>
      <dc:creator>Roberto Morais</dc:creator>
      <pubDate>Sun, 08 Jun 2025 18:04:15 +0000</pubDate>
      <link>https://dev.to/fuenrob/buenas-practicas-de-caching-en-go-para-apis-rapidas-y-eficientes-4153</link>
      <guid>https://dev.to/fuenrob/buenas-practicas-de-caching-en-go-para-apis-rapidas-y-eficientes-4153</guid>
      <description>&lt;p&gt;El caching puede ser el superpoder secreto de tus aplicaciones escritas en Go. Implementarlo bien marca la diferencia entre una API que responde en milisegundos y otra que colapsa bajo carga. Pero no todo es cuestión de poner un &lt;code&gt;map[string]interface{}&lt;/code&gt; en memoria y listo. Vamos a hablar de buenas prácticas reales para cachear datos de forma eficiente y escalable en Go.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 1. Antes de cachear, mide y clasifica
&lt;/h2&gt;

&lt;p&gt;Antes de meter cualquier cosa al caché, párate a pensar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿Cuánto pesa lo que vas a cachear?&lt;/li&gt;
&lt;li&gt;¿Con qué frecuencia se accede?&lt;/li&gt;
&lt;li&gt;¿Vale la pena mantenerlo en memoria?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La clave está en identificar el &lt;strong&gt;hot data&lt;/strong&gt; (datos que se acceden con frecuencia) y diferenciarlo del &lt;strong&gt;cold data&lt;/strong&gt; (datos que casi nunca se usan). Cachear absolutamente todo es una receta para quedarte sin RAM, y lo peor: para perder el control del rendimiento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consejo:&lt;/strong&gt; Si los datos fríos aún son importantes, considera archivarlos en almacenamiento más barato o comprimirlos.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 2. ¿Caché local o distribuido?
&lt;/h2&gt;

&lt;p&gt;Aquí entra un dilema común:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;¿Guardo los datos en memoria local del proceso o uso algo como Redis?&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  ➕ Caché local:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ultra rápido (lectura en nanosegundos).&lt;/li&gt;
&lt;li&gt;Fácil de implementar (&lt;code&gt;sync.Map&lt;/code&gt;, &lt;code&gt;map&lt;/code&gt;, o librerías como &lt;code&gt;golang-lru&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Pero... &lt;strong&gt;no es escalable&lt;/strong&gt; por sí solo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En un entorno con múltiples instancias (por ejemplo, corriendo en Kubernetes), los datos cacheados en un pod &lt;strong&gt;no están disponibles en otro&lt;/strong&gt;, lo que puede generar inconsistencias.&lt;/p&gt;
&lt;h3&gt;
  
  
  ➕ Caché distribuido (ej: Redis, Memcached):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Acceso uniforme para todos los servicios.&lt;/li&gt;
&lt;li&gt;Ideal cuando necesitas compartir estado entre múltiples instancias.&lt;/li&gt;
&lt;li&gt;Pero... implica más complejidad y algo más de latencia.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ✅ Alternativas mixtas:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sticky sessions&lt;/strong&gt;: enrutar siempre al mismo pod (con cuidado).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replicar el caché en cada instancia&lt;/strong&gt;: más consumo de memoria, pero muy resiliente.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🧩 3. Aprovecha el cache de la CPU
&lt;/h2&gt;

&lt;p&gt;Este es un punto que pocas veces se discute, pero puede marcar una diferencia interesante en apps de alto rendimiento.&lt;/p&gt;

&lt;p&gt;La forma en que organizas los datos en memoria afecta cómo los cachea la CPU (L1, L2, L3). En estructuras grandes, si los campos que más usas están dispersos o mal alineados, el acceso será más lento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tips para Go:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agrupa campos que se usen juntos en structs.&lt;/li&gt;
&lt;li&gt;Reduce estructuras grandes o complejas si solo necesitas una parte.&lt;/li&gt;
&lt;li&gt;Evita punteros innecesarios en ciclos críticos.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🧹 4. No olvides la limpieza (eviction)
&lt;/h2&gt;

&lt;p&gt;Tu caché debería tener una política clara para no crecer sin control. Las más comunes son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LRU (Least Recently Used)&lt;/strong&gt;: elimina el dato menos usado recientemente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LFU (Least Frequently Used)&lt;/strong&gt;: elimina el que menos veces se ha accedido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TTL (Time-To-Live)&lt;/strong&gt;: datos con fecha de caducidad.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En Go hay buenas librerías para esto, como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;lru&lt;/span&gt; &lt;span class="s"&gt;"github.com/hashicorp/golang-lru"&lt;/span&gt;

&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;lru&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;128&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// caché de máximo 128 entradas&lt;/span&gt;
&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto evita que se acumulen datos innecesarios y mantiene la memoria bajo control.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Conclusión
&lt;/h2&gt;

&lt;p&gt;Implementar caching bien en Go no es solo cuestión de rendimiento, es cuestión de diseño. Estas son algunas recomendaciones clave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mide y clasifica los datos antes de cachear.&lt;/li&gt;
&lt;li&gt;Usa caché local cuando el rendimiento lo exige, pero ten cuidado en entornos distribuidos.&lt;/li&gt;
&lt;li&gt;Optimiza tus estructuras para que la CPU no sufra.&lt;/li&gt;
&lt;li&gt;Siempre, siempre, establece una política de limpieza.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;¿Has implementado alguna estrategia de caching en Go? ¿Redis, local, algún patrón interesante? Me encantaría leerlo en los comentarios 🚀&lt;/p&gt;

</description>
      <category>go</category>
      <category>webdev</category>
      <category>programming</category>
      <category>backend</category>
    </item>
    <item>
      <title>🧪 Uber Mock: El sucesor natural de GoMock que deberías conocer</title>
      <dc:creator>Roberto Morais</dc:creator>
      <pubDate>Sat, 07 Jun 2025 17:16:50 +0000</pubDate>
      <link>https://dev.to/fuenrob/uber-mock-el-sucesor-natural-de-gomock-que-deberias-conocer-2g30</link>
      <guid>https://dev.to/fuenrob/uber-mock-el-sucesor-natural-de-gomock-que-deberias-conocer-2g30</guid>
      <description>&lt;p&gt;Desde que el repositorio oficial &lt;a href="https://github.com/golang/mock" rel="noopener noreferrer"&gt;&lt;code&gt;golang/mock&lt;/code&gt;&lt;/a&gt; fue archivado, muchos desarrolladores de Go han estado buscando alternativas para continuar generando &lt;em&gt;mocks&lt;/em&gt; sin tener que reescribir medio proyecto.&lt;/p&gt;

&lt;p&gt;Ahí es donde entra &lt;strong&gt;Uber Mock&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ¿Qué es Uber Mock?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/uber-go/mock" rel="noopener noreferrer"&gt;Uber Mock&lt;/a&gt; es un &lt;em&gt;fork&lt;/em&gt; directo de GoMock, mantenido activamente por el equipo de ingeniería de Uber. Después de que el repositorio original fuera archivado, Uber decidió continuar el desarrollo de forma oficial, manteniendo compatibilidad total con la API existente.&lt;/p&gt;

&lt;p&gt;En la práctica, es como si el mantenimiento de &lt;code&gt;golang/mock&lt;/code&gt; se hubiera trasladado a un nuevo hogar.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Ventajas de Uber Mock
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Migración sin dolor
&lt;/h3&gt;

&lt;p&gt;La API es &lt;em&gt;idéntica&lt;/em&gt; a la de &lt;code&gt;golang/mock&lt;/code&gt;. Si ya tienes un proyecto con mocks generados usando &lt;code&gt;mockgen&lt;/code&gt;, lo único que necesitas hacer es cambiar el import:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- import "github.com/golang/mock/gomock"
&lt;/span&gt;&lt;span class="gi"&gt;+ import "go.uber.org/mock/gomock"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y listo. Tus tests seguirán funcionando como antes.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Mantenimiento activo
&lt;/h3&gt;

&lt;p&gt;Uber lo actualiza regularmente con &lt;strong&gt;bug fixes&lt;/strong&gt;, mejoras internas y compatibilidad con nuevas versiones de Go. Esto es clave si no quieres que tus dependencias se queden obsoletas.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Probado en producción
&lt;/h3&gt;

&lt;p&gt;No es un proyecto experimental. Está en uso dentro de la infraestructura de Uber y en miles de otros proyectos que confiaban en &lt;code&gt;golang/mock&lt;/code&gt;. La comunidad lo ha adoptado rápidamente como la alternativa &lt;em&gt;de facto&lt;/em&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Compatibilidad total
&lt;/h3&gt;

&lt;p&gt;Uber Mock funciona con el código generado por &lt;code&gt;mockgen&lt;/code&gt;, las interfaces existentes, y todo el ecosistema que giraba en torno a &lt;code&gt;golang/mock&lt;/code&gt;. Si tu proyecto tiene una gran base de tests, esto es un alivio.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Posibles contras a tener en cuenta
&lt;/h2&gt;

&lt;p&gt;Ninguna herramienta es perfecta. Uber Mock también tiene sus limitaciones:&lt;/p&gt;

&lt;h3&gt;
  
  
  • Dependencia externa
&lt;/h3&gt;

&lt;p&gt;Ahora dependes del mantenimiento de Uber, lo cual no es crítico (es una empresa que cuida su stack), pero no es lo mismo que un repositorio oficial de la comunidad Go.&lt;/p&gt;




&lt;h3&gt;
  
  
  • Falta de features modernas
&lt;/h3&gt;

&lt;p&gt;Herramientas como &lt;a href="https://github.com/vektra/mockery" rel="noopener noreferrer"&gt;Mockery&lt;/a&gt; han evolucionado más en términos de DX (&lt;em&gt;developer experience&lt;/em&gt;). Por ejemplo, generación más sencilla, compatibilidad con tipos genéricos, y una CLI más amigable.&lt;/p&gt;




&lt;h3&gt;
  
  
  • Sintaxis algo verbosa
&lt;/h3&gt;

&lt;p&gt;Si ya usabas GoMock, sabes que los tests pueden volverse algo pesados de leer. Esto sigue igual. Uber Mock no ha hecho grandes cambios en la ergonomía de uso.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 ¿Deberías migrar?
&lt;/h2&gt;

&lt;p&gt;Si ya usabas &lt;code&gt;golang/mock&lt;/code&gt;, &lt;strong&gt;sí&lt;/strong&gt;. Uber Mock es la ruta natural: no cambias tu código, no rompes nada, y sigues recibiendo updates.&lt;/p&gt;

&lt;p&gt;Si estás empezando un proyecto nuevo, podrías comparar con otras opciones como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mockery&lt;/strong&gt;: generación a partir de anotaciones o CLI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testify&lt;/strong&gt;: más sencillo, aunque con menor control sobre los mocks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hand-written mocks&lt;/strong&gt;: para los más minimalistas.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💬 ¿Ya lo estás usando?
&lt;/h2&gt;

&lt;p&gt;¿Te tocó migrar desde &lt;code&gt;golang/mock&lt;/code&gt;? ¿Estás explorando otras opciones como Mockery? ¿O prefieres evitar los mocks y testear a otro nivel?&lt;/p&gt;

&lt;p&gt;¡Te leo en los comentarios! 👇&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🔌 Introducción al Model Context Protocol (MCP) con Go y Claude Desktop</title>
      <dc:creator>Roberto Morais</dc:creator>
      <pubDate>Tue, 22 Apr 2025 14:17:38 +0000</pubDate>
      <link>https://dev.to/fuenrob/introduccion-al-model-context-protocol-mcp-con-go-y-claude-desktop-4a9p</link>
      <guid>https://dev.to/fuenrob/introduccion-al-model-context-protocol-mcp-con-go-y-claude-desktop-4a9p</guid>
      <description>&lt;p&gt;¿Te gustaría conectar tus herramientas y datos directamente con modelos de lenguaje como Claude? El Model Context Protocol (MCP) es una solución emergente que permite a los desarrolladores integrar aplicaciones y datos con modelos de lenguaje de manera estandarizada y eficiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤖 ¿Qué es el Model Context Protocol (MCP)?
&lt;/h2&gt;

&lt;p&gt;El MCP es un protocolo abierto desarrollado por Anthropic que estandariza la forma en que las aplicaciones proporcionan contexto a los modelos de lenguaje (LLMs). Piensa en MCP como un puerto USB-C para aplicaciones de inteligencia artificial, proporcionando una manera uniforme de conectar modelos de lenguaje con diversas fuentes de datos y herramientas.​&lt;/p&gt;

&lt;p&gt;Con MCP, puedes permitir que un modelo de lenguaje interactúe directamente con tu sistema de archivos, bases de datos, APIs y más, sin necesidad de interfaces humanas como botones o cuadros de búsqueda.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Ventajas de MCP
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Estándar abierto: Facilita la integración de modelos de lenguaje con diversas aplicaciones y datos.&lt;/li&gt;
&lt;li&gt;Flexibilidad: Permite a los desarrolladores construir herramientas personalizadas que los modelos de lenguaje pueden utilizar.&lt;/li&gt;
&lt;li&gt;Eficiencia: Reduce la necesidad de interfaces intermedias, permitiendo una comunicación directa entre modelos y aplicaciones.&lt;/li&gt;
&lt;li&gt;Comunidad activa: Existe una comunidad creciente de desarrolladores contribuyendo con implementaciones y ejemplos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚠️ Consideraciones y desafíos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Seguridad: Al permitir que los modelos de lenguaje interactúen directamente con sistemas y datos, es crucial implementar medidas de seguridad adecuadas.&lt;/li&gt;
&lt;li&gt;Gestión de permisos: Es necesario definir claramente qué acciones puede realizar el modelo de lenguaje.&lt;/li&gt;
&lt;li&gt;Madurez del protocolo: Aunque MCP está ganando tracción, todavía está en desarrollo activo y puede experimentar cambios.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧪 Ejemplo básico: Crear un servidor MCP en Go
&lt;/h2&gt;

&lt;p&gt;A continuación, se muestra un ejemplo simple de cómo crear un servidor MCP en Go utilizando la biblioteca &lt;strong&gt;mcp-go&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"context"&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;

    &lt;span class="s"&gt;"github.com/mark3labs/mcp-go/mcp"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/mark3labs/mcp-go/server"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c"&gt;// Definir una herramienta simple que responde con "Hola, mundo"&lt;/span&gt;
    &lt;span class="n"&gt;tool&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tool&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;        &lt;span class="s"&gt;"saludar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Devuelve un saludo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Parameters&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToolParameter&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallToolRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallToolResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallToolResult&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewTextContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"¡Hola, mundo!"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Servidor MCP en ejecución..."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este servidor define una herramienta llamada "saludar" que, cuando es llamada por el modelo de lenguaje, responde con "¡Hola, mundo!".&lt;/p&gt;

&lt;h2&gt;
  
  
  🖥️ Integración con Claude Desktop
&lt;/h2&gt;

&lt;p&gt;Claude Desktop es una aplicación que permite a los modelos de lenguaje interactuar con tu entorno de escritorio. Al configurar un servidor MCP como el anterior, puedes extender las capacidades de Claude para que realice tareas personalizadas en tu sistema.​&lt;/p&gt;

&lt;h2&gt;
  
  
  🎥 Aprende más en mi video de YouTube
&lt;/h2&gt;

&lt;p&gt;Si deseas una guía paso a paso sobre cómo configurar un servidor MCP en Go e integrarlo con Claude Desktop, te invito a ver mi video:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/fjskXzBjlwE"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;En el video, cubro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creación de un servidor MCP funcional.&lt;/li&gt;
&lt;li&gt;Integración con Claude Desktop para aprovechar al máximo tus herramientas personalizadas.​&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Espero que este artículo te haya proporcionado una visión clara sobre el Model Context Protocol y cómo puedes comenzar a utilizarlo con Go y Claude Desktop. Si tienes preguntas o deseas compartir tus experiencias, ¡no dudes en comentar!&lt;/p&gt;

</description>
      <category>go</category>
      <category>mcp</category>
      <category>chatgpt</category>
      <category>ai</category>
    </item>
    <item>
      <title>🚀 ¡Go 1.24 ya está aquí! 🚀</title>
      <dc:creator>Roberto Morais</dc:creator>
      <pubDate>Tue, 11 Feb 2025 21:28:43 +0000</pubDate>
      <link>https://dev.to/fuenrob/go-124-ya-esta-aqui-3ad3</link>
      <guid>https://dev.to/fuenrob/go-124-ya-esta-aqui-3ad3</guid>
      <description>&lt;p&gt;La nueva versión de Go trae mejoras increíbles que harán nuestro código más eficiente, limpio y rápido. Aquí te cuento las novedades más destacadas:&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Nueva función testing.B.Loop para benchmarks
&lt;/h3&gt;

&lt;p&gt;Adiós al clásico for i := 0; i &amp;lt; b.N; i++, ahora testing.B.Loop se encarga de todo, mejorando la precisión y evitando optimizaciones no deseadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Implementación de mapas con “Swiss Table”
&lt;/h3&gt;

&lt;p&gt;Los mapas en Go ahora son más rápidos y usan menos memoria. Si trabajas con estructuras grandes, esta optimización puede marcar la diferencia.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Alias de tipos genéricos
&lt;/h3&gt;

&lt;p&gt;Una mejora clave para la mantenibilidad y reutilización del código, facilitando la creación de abstracciones más limpias.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Nueva directiva tool en go.mod
&lt;/h3&gt;

&lt;p&gt;Ahora podemos gestionar herramientas externas dentro del go.mod, asegurando que todos los devs de un proyecto usen la misma versión de herramientas como linters y generadores de código.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Salida JSON en go build y go test
&lt;/h3&gt;

&lt;p&gt;Perfecto para integraciones con CI/CD, permitiendo análisis automatizado de errores y generación de informes detallados.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Nueva etiqueta omitzero en JSON
&lt;/h3&gt;

&lt;p&gt;Evita incluir valores cero en la serialización JSON, haciendo las respuestas más limpias y reduciendo el tamaño de los datos.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Optimización del rendimiento
&lt;/h3&gt;

&lt;p&gt;Go 1.24 introduce mejoras en la asignación de memoria, gestión de concurrencia y optimización de mutexes, haciendo que nuestras aplicaciones sean aún más eficientes.&lt;/p&gt;

&lt;p&gt;📌 ¿Cuál de estas novedades crees que tendrá mayor impacto en tu día a día? ¡Déjame tu opinión en los comentarios! 👇&lt;/p&gt;

</description>
      <category>go</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>🚀 ¿Aún usas Docker Desktop? 🐳</title>
      <dc:creator>Roberto Morais</dc:creator>
      <pubDate>Mon, 27 Jan 2025 21:03:22 +0000</pubDate>
      <link>https://dev.to/fuenrob/aun-usas-docker-desktop-1m6</link>
      <guid>https://dev.to/fuenrob/aun-usas-docker-desktop-1m6</guid>
      <description>&lt;p&gt;¡Es hora de cambiar y optimizar tu flujo de trabajo! 💻&lt;/p&gt;

&lt;p&gt;Si trabajas con Docker en macOS, seguramente has notado que Docker Desktop puede ser un devorador de recursos. Esto se traduce en ralentización del sistema, consumo excesivo de batería y una experiencia menos fluida. Pero, ¿sabías que hay alternativas más rápidas y eficientes que pocos usan? 🤔&lt;/p&gt;

&lt;p&gt;Te presento algunas de las mejores opciones:&lt;/p&gt;

&lt;p&gt;🔹 Para macOS: OrbStack&lt;/p&gt;

&lt;p&gt;1️⃣ Velocidad: Inicia en solo 2 segundos ⚡. Emulación rápida de x86 y optimización de red y sistema de archivos.&lt;/p&gt;

&lt;p&gt;2️⃣ Ligereza: Reduce el uso de CPU y disco, además de prolongar la vida de tu batería 🔋.&lt;/p&gt;

&lt;p&gt;3️⃣ Simplicidad: Interfaz amigable y fácil de usar. Gestiona contenedores, imágenes y volúmenes desde la barra de menú.&lt;/p&gt;

&lt;p&gt;4️⃣ Potencia: Compatible con Docker, Kubernetes y distribuciones Linux.&lt;/p&gt;

&lt;p&gt;🔹 Para Windows: Rancher Desktop&lt;/p&gt;

&lt;p&gt;Rancher Desktop es una opción potente y gratuita para quienes trabajan en Windows:&lt;/p&gt;

&lt;p&gt;✅ Soporte para contenedores Docker y Kubernetes.&lt;/p&gt;

&lt;p&gt;✅ Basado en K3s, una distribución ligera de Kubernetes.&lt;/p&gt;

&lt;p&gt;✅ Herramientas fáciles de usar para gestionar contenedores y clústeres.&lt;/p&gt;

&lt;p&gt;✅ Compatible con WSL2, lo que mejora la experiencia de Linux en Windows.&lt;/p&gt;

&lt;p&gt;🔹 Otra alternativa: Podman&lt;/p&gt;

&lt;p&gt;Podman es una excelente opción multiplataforma para quienes buscan un enfoque diferente:&lt;/p&gt;

&lt;p&gt;✅ Sin Daemon: A diferencia de Docker, no requiere un servicio en segundo plano para ejecutarse.&lt;/p&gt;

&lt;p&gt;✅ Compatible con los comandos de Docker, facilitando la migración.&lt;/p&gt;

&lt;p&gt;✅ Ideal para entornos que requieren una mayor seguridad y control sobre contenedores.&lt;/p&gt;

&lt;p&gt;✅ Soporte nativo para rootless (contenedores sin privilegios de administrador).&lt;/p&gt;

&lt;p&gt;🌍 No importa el sistema operativo que uses, hay alternativas que pueden mejorar tu experiencia de desarrollo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;macOS: OrbStack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows: Rancher Desktop.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Linux/Multiplataforma: Podman.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 Si quieres un entorno de desarrollo más rápido y eficiente, te recomiendo probar estas herramientas. ¡Tu equipo y tu productividad te lo agradecerán!&lt;/p&gt;

&lt;p&gt;Aquí te dejo un vídeo de YouTube en el que habló sobre estas alternativas.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/mJ8LUqhrA1A"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Y cuéntame, ¿cuál es tu experiencia con Docker Desktop? ¿Has probado alguna de estas alternativas? ¡Déjalo en los comentarios! 👇&lt;/p&gt;

</description>
      <category>docker</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Fundamentos de Go: Variables, Constantes, Estructuras de Control y Datos</title>
      <dc:creator>Roberto Morais</dc:creator>
      <pubDate>Sat, 04 Jan 2025 18:12:33 +0000</pubDate>
      <link>https://dev.to/fuenrob/fundamentos-de-go-variables-constantes-estructuras-de-control-y-datos-d20</link>
      <guid>https://dev.to/fuenrob/fundamentos-de-go-variables-constantes-estructuras-de-control-y-datos-d20</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/sCs8EA4H7R8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;¡Hola a todos! En este módulo del curso de Go, vamos a explorar los fundamentos del lenguaje. Ya hemos configurado el entorno de desarrollo y hemos escrito nuestro primer programa, pero ahora es el momento de aprender a trabajar con variables, operadores, estructuras de control y estructuras de datos fundamentales.&lt;/p&gt;

&lt;h2&gt;
  
  
  Declaración de Variables en Go
&lt;/h2&gt;

&lt;p&gt;En Go, podemos declarar variables de dos maneras diferentes. La primera es utilizando la palabra clave &lt;strong&gt;var&lt;/strong&gt;, seguida del nombre de la variable y luego el tipo de dato que almacenará. Por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para guardar un dato en la variable, escribimos el nombre de la variable seguido del símbolo &lt;strong&gt;=&lt;/strong&gt; y el valor que queremos almacenar. Para acceder al valor de la variable, simplemente referenciamos su nombre.&lt;/p&gt;

&lt;p&gt;La segunda forma de declarar variables es utilizando la inferencia de tipos, que permite a Go deducir el tipo de la variable basado en el valor asignado. Para esto, usamos &lt;strong&gt;:=&lt;/strong&gt; después del nombre de la variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"Roberto"&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Constantes en Go
&lt;/h2&gt;

&lt;p&gt;Las constantes se declaran utilizando la palabra clave &lt;strong&gt;const&lt;/strong&gt; y su valor no puede cambiar durante la ejecución del programa. Go tiene tipos de datos comunes como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Strings&lt;/strong&gt;: texto (string)&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Enteros&lt;/strong&gt;: números enteros (int)&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Flotantes&lt;/strong&gt;: números decimales (float)&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Booleanos&lt;/strong&gt;: verdadero o falso (bool)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En cuanto a los flotantes, Go ofrece dos tipos: &lt;strong&gt;float32&lt;/strong&gt; y &lt;strong&gt;float64&lt;/strong&gt;. Por defecto, se asigna &lt;strong&gt;float64&lt;/strong&gt;, que representa de 15 a 17 dígitos significativos, mientras que &lt;strong&gt;float32&lt;/strong&gt; representa de 6 a 9.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conversión de Tipos en Go
&lt;/h2&gt;

&lt;p&gt;Go permite la conversión de tipos explícita cuando es necesario. Por ejemplo, podemos convertir un &lt;strong&gt;int&lt;/strong&gt; a &lt;strong&gt;float64&lt;/strong&gt; utilizando la función &lt;strong&gt;float64&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
    &lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También es posible convertir de un string a un int, pero no se puede hacer directamente. Para ello, utilizamos la función &lt;strong&gt;Atoi&lt;/strong&gt; del paquete &lt;strong&gt;strconv&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"strconv"&lt;/span&gt;

    &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strconv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Atoi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"123"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este caso, &lt;strong&gt;number&lt;/strong&gt; contendrá el número convertido y &lt;strong&gt;err&lt;/strong&gt; contendrá cualquier error que pueda ocurrir durante la conversión.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operadores en Go
&lt;/h2&gt;

&lt;p&gt;Go soporta varios operadores. Los más comunes son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Operadores Aritméticos&lt;/strong&gt;: para sumar, restar, multiplicar, dividir o obtener el resto de una división.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Operadores Lógicos&lt;/strong&gt;: AND, OR, NOT.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Operadores de Comparación&lt;/strong&gt;: igual a, diferente de, menor que, mayor que, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Estructuras de Control en Go
&lt;/h2&gt;

&lt;p&gt;Las estructuras de control son esenciales para dirigir cómo se ejecuta tu programa. Vamos a ver cómo usar condicionales para manejar diferentes situaciones en tu código.&lt;/p&gt;

&lt;h3&gt;
  
  
  Condicionales If
&lt;/h3&gt;

&lt;p&gt;La estructura &lt;strong&gt;If&lt;/strong&gt; es simple. Se escribe la palabra &lt;strong&gt;If&lt;/strong&gt; seguida de la condición y el bloque de código que se ejecutará si la condición se cumple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="m"&gt;18&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Eres mayor de edad."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Eres menor de edad."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este caso, si &lt;strong&gt;age&lt;/strong&gt; es 18 o más, se ejecutará el primer bloque. Si es menor, se ejecutará el bloque del &lt;strong&gt;else&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Else-If
&lt;/h3&gt;

&lt;p&gt;También podemos usar &lt;strong&gt;Else-If&lt;/strong&gt; para realizar verificaciones adicionales:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="m"&gt;18&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Eres mayor de edad."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Eres menor de edad."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Edad no válida."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Switch
&lt;/h3&gt;

&lt;p&gt;La estructura &lt;strong&gt;Switch&lt;/strong&gt; es una forma concisa de manejar múltiples condiciones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="n"&gt;day&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"Monday"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Inicio de semana."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"Friday"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Fin de semana."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Día regular."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Bucles en Go
&lt;/h2&gt;

&lt;p&gt;El bucle &lt;strong&gt;For&lt;/strong&gt; es el principal bucle en Go y puede actuar como un bucle típico o como un bucle estilo &lt;strong&gt;While&lt;/strong&gt;. Aquí hay un ejemplo de un bucle tradicional:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También puedes usar &lt;strong&gt;For&lt;/strong&gt; como un &lt;strong&gt;While&lt;/strong&gt; indicando solo la condición:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recuerda que puedes usar &lt;strong&gt;Break&lt;/strong&gt; para salir de un bucle prematuramente o &lt;strong&gt;Continue&lt;/strong&gt; para saltar una iteración.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estructuras de Datos en Go
&lt;/h2&gt;

&lt;p&gt;Las estructuras de datos más importantes en Go son arrays, slices y maps. Vamos a empezar con los arrays.&lt;/p&gt;

&lt;h3&gt;
  
  
  Arrays
&lt;/h3&gt;

&lt;p&gt;Los arrays en Go tienen un tamaño fijo y todos sus elementos deben ser del mismo tipo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Los arrays tienen un límite; no puedes agregar elementos en índices fuera de ese límite.&lt;/p&gt;

&lt;h3&gt;
  
  
  Slides
&lt;/h3&gt;

&lt;p&gt;Los slices son más flexibles que los arrays, ya que pueden crecer o reducir su tamaño dinámicamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;slice&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;slice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puedes crear sub-slices de manera eficiente utilizando el nombre del slice seguido de corchetes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="n"&gt;subSlice&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Maps
&lt;/h3&gt;

&lt;p&gt;Los maps almacenan pares clave-valor y son útiles para asociar datos de manera rápida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="n"&gt;ages&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Roberto"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;32&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Roberto"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Resumen
&lt;/h2&gt;

&lt;p&gt;En resumen, hemos cubierto cómo manejar variables y constantes, usar operadores, implementar control de flujo y trabajar con arrays, slices y maps. Estos son los bloques de construcción de cualquier programa en Go. En el próximo módulo, nos adentraremos en funciones y estructuras, así que no te lo pierdas.&lt;/p&gt;

&lt;p&gt;Para más información y recursos, puedes unirte a nuestra comunidad en &lt;a href="https://discord.gg/kfGUGatSyU" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; o convertirte en miembro de nuestro canal en &lt;a href="https://www.youtube.com/channel/UCmCAOhYY86ynJsSPnu8knGw/join" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>learning</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Curso de Golang Para Principiantes: Instalación y Configuración del Entorno de Desarrollo</title>
      <dc:creator>Roberto Morais</dc:creator>
      <pubDate>Fri, 03 Jan 2025 09:41:39 +0000</pubDate>
      <link>https://dev.to/fuenrob/curso-de-golang-para-principiantes-instalacion-y-configuracion-del-entorno-de-desarrollo-2oil</link>
      <guid>https://dev.to/fuenrob/curso-de-golang-para-principiantes-instalacion-y-configuracion-del-entorno-de-desarrollo-2oil</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/0RrQ49Kiuwc"&gt;
&lt;/iframe&gt;
&lt;br&gt;
Bienvenidos al primer módulo de nuestro curso de Go, donde comenzaremos desde cero explorando qué es Go, por qué deberías aprenderlo y cómo configurar tu entorno de desarrollo. Si eres nuevo en Go, este artículo es el punto de partida perfecto. Vamos a sumergirnos en el fascinante mundo de Golang.&lt;/p&gt;
&lt;h2&gt;
  
  
  ¿Qué es Go?
&lt;/h2&gt;

&lt;p&gt;Go, también conocido como Golang, es un lenguaje de programación moderno creado por Google en 2007 y lanzado al público en 2009. Sus principales desarrolladores fueron Robert Griesemer, Rob Pike y Ken Thompson. Es un lenguaje de código abierto, compilado y tipado, diseñado para ser eficiente, simple y fácil de aprender.&lt;/p&gt;
&lt;h3&gt;
  
  
  ¿Por qué aprender Go?
&lt;/h3&gt;

&lt;p&gt;Go es ideal para construir aplicaciones altamente concurrentes y escalables, desde microservicios hasta grandes sistemas distribuidos. Su rendimiento es comparable al de C o C++, pero con una sintaxis mucho más simple y gestión automática de memoria. A lo largo de este curso, veremos cómo Go facilita la gestión de la concurrencia y cómo nos ayuda a escribir programas rápidos y robustos, desde aplicaciones web hasta sistemas en la nube.&lt;/p&gt;

&lt;p&gt;Grandes empresas como Google, Uber y Dropbox utilizan Go para gestionar infraestructuras complejas. Así que si buscas un lenguaje que combine simplicidad, rendimiento y concurrencia, Go es la elección perfecta.&lt;/p&gt;
&lt;h2&gt;
  
  
  Instalación de Go
&lt;/h2&gt;

&lt;p&gt;Para comenzar a programar en Go, lo primero que necesitamos hacer es instalarlo en nuestro sistema. Para ello, vamos a descargar e instalar Go desde su sitio web oficial &lt;a href="https://go.dev" rel="noopener noreferrer"&gt;go.dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;En su sitio web, haremos clic en el botón de descarga. Aquí podemos descargar el instalador para los diferentes sistemas operativos como Windows, MacOS o Linux, dependiendo de tu sistema operativo. La instalación se llevará a cabo de una manera u otra, y puedes consultar las instrucciones para instalar en tu sistema operativo específico.&lt;/p&gt;
&lt;h3&gt;
  
  
  Instalación en Ubuntu
&lt;/h3&gt;

&lt;p&gt;Si estás usando Ubuntu, aquí están los pasos para instalar Go. Primero, descarga el archivo tar.gz que se encuentra en el sitio web oficial. Una vez que hayas localizado este archivo en tu máquina, ejecuta los siguientes comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /usr/local/go
&lt;span class="nb"&gt;sudo tar&lt;/span&gt; &lt;span class="nt"&gt;-C&lt;/span&gt; /usr/local &lt;span class="nt"&gt;-xzf&lt;/span&gt; go1.23.linux-amd64.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Es recomendable ejecutar estos comandos con permisos de superadministrador para evitar problemas al eliminar o crear nuevas carpetas. Si no recibes ningún mensaje en tu terminal después de ejecutar estos comandos, significa que ambos se han ejecutado correctamente y ahora tienes Go instalado en tu computadora.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuración de Variables de Entorno
&lt;/h2&gt;

&lt;p&gt;Ahora necesitamos agregar el ejecutable de Go a nuestra ruta. Para ello, editaremos el archivo .profile con el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;vi &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este archivo, al final, añadiremos la siguiente línea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:/usr/local/go/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Después de agregar esta línea, puedes ejecutar el comando &lt;code&gt;go version&lt;/code&gt; en tu terminal para verificar que Go está instalado correctamente. Si no se reconoce el comando, puede que necesites cerrar y volver a abrir tu terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuración de GOROOT y GOPATH
&lt;/h3&gt;

&lt;p&gt;Ahora configuraremos dos variables de entorno: GOROOT y GOPATH. GOROOT permitirá que el compilador de Go y otras herramientas encuentren las bibliotecas estándar de Go, mientras que GOPATH es la ruta raíz del espacio de trabajo de Go, donde encontraremos las carpetas como src, pkg y bin.&lt;/p&gt;

&lt;p&gt;Para esto, editaremos el archivo .bashrc de tu usuario:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Al final de este archivo, añadiremos las siguientes líneas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GOROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/go
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GOPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/go
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:&lt;span class="nv"&gt;$GOROOT&lt;/span&gt;/bin:&lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Después de editar el archivo .bashrc, ejecuta el comando &lt;code&gt;source $HOME/.bashrc&lt;/code&gt; para refrescar la configuración y tener acceso a las variables de entorno que acabamos de configurar.&lt;/p&gt;

&lt;h2&gt;
  
  
  IDE Recomendados
&lt;/h2&gt;

&lt;p&gt;Ahora que tenemos Go instalado y configurado, hablemos sobre los IDEs que recomiendo. El primero es Visual Studio Code. Si instalas la extensión de Go desarrollada por el equipo de Google, tendrás mucha ayuda al desarrollar tus scripts en Go. Pero si prefieres un IDE real, te recomiendo GoLand, desarrollado por JetBrains. Este IDE es muy potente, aunque es de pago.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creando tu Primer Script en Go
&lt;/h2&gt;

&lt;p&gt;Una vez que tu entorno de desarrollo está correctamente configurado, vamos a crear nuestro primer script en Go. Lo primero que debemos hacer al comenzar a programar en Go es inicializar un módulo. Todos los programas de Go son módulos o paquetes, por lo que debemos lanzar el comando &lt;code&gt;go mod init&lt;/code&gt; seguido del nombre de nuestro módulo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go mod init example/hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Normalmente, este nombre es la ruta donde se aloja el código del módulo, como por ejemplo: &lt;code&gt;github.com/usuario/nombre_del_modulo&lt;/code&gt;. Después de ejecutar este comando, verás un mensaje en tu terminal y se creará un nuevo archivo llamado &lt;code&gt;go.mod&lt;/code&gt; en tu carpeta. Este archivo contiene el nombre de nuestro módulo y la versión de compatibilidad con Go.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creando el Archivo main.go
&lt;/h3&gt;

&lt;p&gt;Ahora que tenemos nuestro módulo inicializado, crearemos un archivo llamado &lt;code&gt;main.go&lt;/code&gt;. Todos los programas de Go comienzan con la declaración del paquete y el punto de entrada es la función main. En este ejemplo, primero declaramos que este programa pertenece al paquete main, luego importamos el paquete fmt, que es parte de la biblioteca estándar de Go y nos permite imprimir mensajes en la consola.&lt;/p&gt;

&lt;p&gt;Finalmente, en la función main, utilizamos &lt;code&gt;fmt.Println&lt;/code&gt; para mostrar el mensaje: "Hola Mundo". Aquí tienes un ejemplo de cómo debería verse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hola Mundo"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para ejecutar este programa, abre un terminal y ejecuta el comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go run main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verás cómo aparece el mensaje "Hola Mundo" en tu terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compilación y Generación de Binarios
&lt;/h2&gt;

&lt;p&gt;Si quieres compilar y generar el binario de tu aplicación, que sería el ejecutable de tu programa, debes ejecutar el comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto generará un binario de tu aplicación, que en este caso se llamará "hello". Otra orden que puede interesarte es &lt;code&gt;go install&lt;/code&gt;, que compila e instala los paquetes directamente en tu máquina.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comentarios en Go
&lt;/h2&gt;

&lt;p&gt;Una parte muy importante de escribir buen código es asegurarse de que sea comprensible para ti y para los demás. En Go, esto significa seguir las convenciones de estilo y escribir comentarios donde sea necesario. Go permite dos tipos de comentarios de una línea, escritos con &lt;code&gt;//&lt;/code&gt; y comentarios de varias líneas escritos con &lt;code&gt;/*&lt;/code&gt; y cerrados con &lt;code&gt;*/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Aunque Go favorece un código simple y auto-descriptivo, a veces es útil añadir un comentario explicando alguna función compleja en tu código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;En este módulo, hemos instalado Go en nuestra máquina, configurado el entorno de desarrollo y escrito el código para nuestro primer programa en Go. En el próximo módulo, exploraremos más a fondo los fundamentos de Go. ¡Nos vemos pronto!&lt;/p&gt;

&lt;p&gt;Si deseas unirte a la comunidad de Golang y Docker, puedes hacerlo en nuestro servidor de Discord &lt;a href="https://discord.gg/kfGUGatSyU" rel="noopener noreferrer"&gt;aquí&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para más contenido sobre Golang y Docker, no dudes en unirte a mi canal de YouTube &lt;a href="https://www.youtube.com/channel/UCmCAOhYY86ynJsSPnu8knGw/join" rel="noopener noreferrer"&gt;Roberto Morais - YouTube&lt;/a&gt; donde encontrarás tutoriales profundos y consejos útiles.&lt;/p&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>learning</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Lo nuevo en Golang 1.23: Mejoras en el lenguaje, compilador y herramientas</title>
      <dc:creator>Roberto Morais</dc:creator>
      <pubDate>Tue, 17 Dec 2024 18:59:27 +0000</pubDate>
      <link>https://dev.to/fuenrob/lo-nuevo-en-golang-123-mejoras-en-el-lenguaje-compilador-y-herramientas-1icm</link>
      <guid>https://dev.to/fuenrob/lo-nuevo-en-golang-123-mejoras-en-el-lenguaje-compilador-y-herramientas-1icm</guid>
      <description>&lt;p&gt;El 13 de agosto de 2024, el equipo de Go lanzó Golang 1.23, una versión que trae novedades importantes y mejoras enfocadas en la eficiencia, el compilador y el lenguaje en general. ¡Aquí te resumo lo más destacado de esta actualización!&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Cambios en el Lenguaje
&lt;/h2&gt;

&lt;p&gt;🔄 Iteradores en bucles for-range&lt;/p&gt;

&lt;p&gt;Ahora, los bucles for-range soportan funciones iteradoras con las siguientes firmas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;func(func() bool)&lt;/li&gt;
&lt;li&gt;func(func(K) bool)&lt;/li&gt;
&lt;li&gt;func(func(K, V) bool)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto facilita la iteración sobre colecciones personalizadas y ofrece mayor flexibilidad al trabajar con estructuras de datos propias.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧩 Alias de tipos genéricos (experimental)
&lt;/h3&gt;

&lt;p&gt;Se introduce un soporte preliminar para alias de tipos genéricos. Aunque todavía está en fase experimental y debe habilitarse manualmente, esta funcionalidad promete simplificar la reutilización de tipos genéricos a medida que evoluciona el lenguaje.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Novedades en Herramientas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📊 Telemetría opcional
&lt;/h3&gt;

&lt;p&gt;Go 1.23 incluye un sistema de telemetría opcional que recopila estadísticas de uso y fallos del compilador. Esta información ayudará al equipo de Go a mejorar futuras versiones.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Activación: go telemetry on&lt;/li&gt;
&lt;li&gt;Más detalles: &lt;a href="https://tip.golang.org/doc/go1.23" rel="noopener noreferrer"&gt;Documentación sobre telemetría&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧑‍💻 Nuevas opciones del comando go
&lt;/h3&gt;

&lt;p&gt;Se han añadido nuevas opciones al comando go que facilitarán la gestión de proyectos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;go env -changed: Muestra solo las variables de entorno modificadas.&lt;/li&gt;
&lt;li&gt;go mod tidy -diff: Muestra los cambios necesarios como un diff sin modificar archivos.&lt;/li&gt;
&lt;li&gt;go list -m -json: Incluye campos como Sum y GoModSum para gestionar dependencias.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚡ Mejoras en el Compilador y Rendimiento
&lt;/h2&gt;

&lt;p&gt;El compilador en Go 1.23 trae optimizaciones importantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Optimización de variables locales: Se ha reducido el uso de memoria gracias a mejoras en la superposición de espacios en la pila.&lt;/li&gt;
&lt;li&gt;Optimización Guiada por Perfil (PGO): Mejora el tiempo de compilación y la eficiencia general en proyectos grandes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estas mejoras no solo aceleran el proceso de desarrollo, sino que también optimizan la ejecución de las aplicaciones en producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔧 Mejoras en el Runtime
&lt;/h2&gt;

&lt;p&gt;Se han optimizado los temporizadores (time.Timer y time.Ticker) para que sean recolectados por el garbage collector más rápidamente cuando pierden referencias. Esto mejora la gestión de recursos y la eficiencia del runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Actualizaciones en Bibliotecas Estándar
&lt;/h2&gt;

&lt;p&gt;Varias bibliotecas estándar reciben mejoras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;crypto/x509: Ahora rellena automáticamente el campo Certificate.Leaf al cargar pares de claves, facilitando el uso de certificados.&lt;/li&gt;
&lt;li&gt;Mejoras en go/types y os.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estas actualizaciones están orientadas a mejorar la seguridad, el rendimiento y la experiencia de desarrollo con Go.&lt;/p&gt;

&lt;h2&gt;
  
  
  🗂️ Compatibilidad y Requisitos de Plataforma
&lt;/h2&gt;

&lt;p&gt;Go 1.23 mantiene la compatibilidad hacia atrás, pero introduce cambios mínimos en los requisitos de algunas plataformas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;macOS: Se requiere macOS 11 Big Sur o superior.&lt;/li&gt;
&lt;li&gt;Linux: Es la última versión compatible con kernel 2.6.32; futuras versiones requerirán al menos kernel 3.2.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Conclusión
&lt;/h2&gt;

&lt;p&gt;La versión 1.23 de Go refuerza el compromiso del lenguaje con la eficiencia, flexibilidad y rendimiento. Las novedades en el compilador, el runtime y las herramientas aseguran que Go siga siendo una opción sólida para desarrolladores de todo el mundo.&lt;/p&gt;

&lt;p&gt;¡Actualiza a Go 1.23 y prueba todas estas novedades! 🚀&lt;/p&gt;

</description>
      <category>go</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Redes neuronales convolucionales (CNN) y redes neuronales recurrentes (RNN)</title>
      <dc:creator>Roberto Morais</dc:creator>
      <pubDate>Mon, 16 Dec 2024 13:06:22 +0000</pubDate>
      <link>https://dev.to/fuenrob/redes-neuronales-convolucionales-cnn-y-redes-neuronales-recurrentes-rnn-10ci</link>
      <guid>https://dev.to/fuenrob/redes-neuronales-convolucionales-cnn-y-redes-neuronales-recurrentes-rnn-10ci</guid>
      <description>&lt;p&gt;Las redes neuronales convolucionales (CNN) y las redes neuronales recurrentes (RNN) son dos tipos de redes neuronales artificiales que se utilizan ampliamente en el campo del aprendizaje profundo. Las CNN se utilizan principalmente para tareas de visión por computadora, mientras que las RNN se utilizan principalmente para tareas de procesamiento de lenguaje natural.&lt;/p&gt;

&lt;p&gt;Las CNN se componen de capas convolucionales, que aplican filtros a la entrada para extraer características relevantes. Estas características se combinan luego en capas completamente conectadas para realizar la clasificación o la regresión.&lt;/p&gt;

&lt;p&gt;Las RNN se componen de capas recurrentes, que mantienen un estado interno que les permite procesar secuencias de datos de manera eficiente.&lt;/p&gt;

&lt;p&gt;Las CNN y las RNN son herramientas poderosas que se utilizan en una amplia variedad de aplicaciones, como el reconocimiento de imágenes, la traducción automática, el procesamiento de lenguaje natural y el análisis de sentimientos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos adicionales
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.deeplearningbook.org/" rel="noopener noreferrer"&gt;Deep Learning Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cs231n.github.io/" rel="noopener noreferrer"&gt;Stanford CS231n: Convolutional Neural Networks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Espero que esta publicación te haya resultado útil. Si tienes alguna pregunta, no dudes en dejar un comentario.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>spanish</category>
    </item>
    <item>
      <title>📝 Buen commit vs. Mal commit: Mejora tu árbol de Git</title>
      <dc:creator>Roberto Morais</dc:creator>
      <pubDate>Thu, 12 Dec 2024 09:26:18 +0000</pubDate>
      <link>https://dev.to/fuenrob/buen-commit-vs-mal-commit-mejora-tu-arbol-de-git-2o6b</link>
      <guid>https://dev.to/fuenrob/buen-commit-vs-mal-commit-mejora-tu-arbol-de-git-2o6b</guid>
      <description>&lt;p&gt;¿Te ha pasado que vuelves a un proyecto después de meses y encuentras un commit llamado "arreglar cosas"? 😬 Sí, a todos nos ha pasado. ¡Pero no tiene que ser así! Hoy quiero hablarte de la importancia de escribir buenos commits y cómo pueden hacer tu vida (y la de tu equipo) mucho más fácil.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 ¿Por qué importa un buen commit?
&lt;/h2&gt;

&lt;p&gt;Un commit no es solo un "guardar partida" en tu código; es como una entrada en el diario de tu proyecto. Describe qué hiciste, por qué lo hiciste y, si es necesario, cómo lo hiciste. Los commits bien escritos:&lt;/p&gt;

&lt;p&gt;✅ Facilitan entender el historial del proyecto.&lt;br&gt;
✅ Ayudan a resolver bugs más rápido.&lt;br&gt;
✅ Mejoran la colaboración en equipo.&lt;/p&gt;

&lt;p&gt;Y lo más importante: te hacen ver como un profesional que sabe lo que hace. 😎&lt;/p&gt;

&lt;p&gt;🚨 Ejemplo de mal commit&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"cambios"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¿Cambios de qué? ¿Arreglaste algo? ¿Agregaste una funcionalidad? ¿Borraste medio repositorio? Nadie lo sabe. Ni siquiera tú lo sabrás en dos semanas. 😅&lt;/p&gt;

&lt;p&gt;Otro clásico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"arreglo bug"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bien por arreglar el bug, pero... ¿qué bug? ¿En qué parte? Sin contexto, no sirve de mucho.&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 Ejemplo de buen commit
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix: corregir validación de emails en el formulario de registro"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔍 Ahora sabemos exactamente qué se hizo y dónde. Si el bug regresa o surge algo relacionado, este commit será una brújula para encontrar la solución.&lt;/p&gt;

&lt;p&gt;Otro ejemplo para nuevas funcionalidades:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: agregar funcionalidad para compartir enlaces en redes sociales"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto no solo dice qué se hizo, sino que usa un convención estándar como Conventional Commits.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Tips para buenos commits
&lt;/h2&gt;

&lt;p&gt;Usa una convención clara:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;feat: para nuevas funcionalidades.&lt;/li&gt;
&lt;li&gt;fix: para correcciones de bugs.&lt;/li&gt;
&lt;li&gt;refactor: para mejorar código sin cambiar funcionalidad.&lt;/li&gt;
&lt;li&gt;docs: para cambios en documentación.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Escribe mensajes descriptivos y precisos:&lt;br&gt;
Un buen commit responde a estas preguntas:&lt;/p&gt;

&lt;p&gt;¿Qué cambiaste?&lt;br&gt;
¿Por qué lo cambiaste?&lt;br&gt;
Haz commits pequeños y específicos:&lt;br&gt;
No mezcles una nueva funcionalidad con arreglos de bugs en el mismo commit. Divide y vencerás.&lt;/p&gt;

&lt;p&gt;Incluye contexto si es necesario:&lt;br&gt;
Si estás corrigiendo un bug complicado, puedes usar el mensaje extendido:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix: corregir error de autenticación al usar OAuth"&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"El error ocurría porque el token expiraba antes de ser validado. Se implementó una lógica para manejar tokens expirados."&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🛠️ Herramientas útiles
&lt;/h2&gt;

&lt;p&gt;Si quieres automatizar o mantener consistencia:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commitizen: Guía para escribir mensajes siguiendo convenciones.&lt;/li&gt;
&lt;li&gt;Husky: Ejecuta hooks de Git para validar commits.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 ¡Haz que tus commits hablen por ti!
&lt;/h2&gt;

&lt;p&gt;Un buen mensaje de commit no solo ayuda a tus compañeros de equipo, sino también a tu yo del futuro. Escribir buenos commits es una inversión pequeña con un gran retorno en claridad y productividad.&lt;/p&gt;

&lt;p&gt;¿Tienes algún truco o convención que uses para tus commits? ¡Déjamelo en los comentarios! 👇&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>gitlab</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>💡 ¿Qué son las API REST y por qué son tan importantes? 💡</title>
      <dc:creator>Roberto Morais</dc:creator>
      <pubDate>Mon, 09 Dec 2024 09:18:25 +0000</pubDate>
      <link>https://dev.to/fuenrob/que-son-las-api-rest-y-por-que-son-tan-importantes-3j7m</link>
      <guid>https://dev.to/fuenrob/que-son-las-api-rest-y-por-que-son-tan-importantes-3j7m</guid>
      <description>&lt;p&gt;En el desarrollo web, es común escuchar términos como REST o API RESTfull. Pero, ¿qué significan exactamente? Una API REST es una interfaz que permite la comunicación entre sistemas usando las reglas del protocolo HTTP. Es como un traductor que facilita que diferentes aplicaciones hablen entre sí, ya sea una app móvil consultando un servidor o una aplicación web pidiendo datos a otro servicio.&lt;/p&gt;

&lt;h1&gt;
  
  
  🎯 Características clave de las API REST:
&lt;/h1&gt;

&lt;p&gt;1️⃣ Basadas en recursos: Cada entidad (usuarios, productos, pedidos) se representa como un recurso que tiene una URL única, como &lt;a href="https://miapp.com/api/users" rel="noopener noreferrer"&gt;https://miapp.com/api/users&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;2️⃣ Uso de métodos HTTP: Se utilizan métodos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GET para obtener datos.&lt;/li&gt;
&lt;li&gt;POST para crear un nuevo recurso.&lt;/li&gt;
&lt;li&gt;PUT o PATCH para actualizar.&lt;/li&gt;
&lt;li&gt;DELETE para eliminar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3️⃣ Sin estado (stateless): Cada petición es independiente; el servidor no almacena información sobre el cliente entre solicitudes.&lt;/p&gt;

&lt;p&gt;4️⃣ Formatos estándar: Los datos suelen enviarse en JSON, lo que hace que las APIs sean ligeras y fáciles de trabajar.&lt;/p&gt;

&lt;h1&gt;
  
  
  📚 Ejemplo básico de API REST:
&lt;/h1&gt;

&lt;p&gt;👉 Supongamos que tienes una aplicación para gestionar libros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL: &lt;a href="https://miapp.com/api/books" rel="noopener noreferrer"&gt;https://miapp.com/api/books&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Método: GET&lt;/li&gt;
&lt;li&gt;Respuesta:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Clean Code"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Robert C. Martin"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The Pragmatic Programmer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Andy Hunt"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  🌟 ¿Por qué usar REST?
&lt;/h1&gt;

&lt;p&gt;REST es sencillo, escalable y funciona perfectamente con aplicaciones modernas, desde webs hasta microservicios. Es el estándar más usado hoy en día para construir APIs.&lt;/p&gt;

&lt;p&gt;📢 Ahora dime, ¿has usado APIs REST en algún proyecto? ¿Qué tal fue tu experiencia?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
