{"id":7921,"date":"2022-08-12T13:01:46","date_gmt":"2022-08-12T11:01:46","guid":{"rendered":"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/\/?p=7921"},"modified":"2023-11-04T12:14:07","modified_gmt":"2023-11-04T11:14:07","slug":"aprendizaje-go","status":"publish","type":"post","link":"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/aprendizaje-go\/","title":{"rendered":"APRENDIZAJE GO"},"content":{"rendered":"\n<p class=\"has-text-align-left\"><strong><em>Empezando con Go<\/em><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"474\" height=\"248\" src=\"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/\/wp-content\/uploads\/2022\/07\/GO.jpg\" alt=\"\" class=\"wp-image-7891\" srcset=\"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-content\/uploads\/2022\/07\/GO.jpg 474w, https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-content\/uploads\/2022\/07\/GO-300x157.jpg 300w\" sizes=\"(max-width: 474px) 100vw, 474px\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-left\">Observaciones<\/p>\n\n\n\n<p class=\"has-text-align-left\">Go es un lenguaje de c\u00f3digo abierto, compilado y tipificado est\u00e1ticamente seg\u00fan la tradici\u00f3n de<br>Algol y C. Cuenta con caracter\u00edsticas como recolecci\u00f3n de basura, tipificaci\u00f3n estructural limitada,<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"has-text-align-left\"><br>funciones de seguridad de la memoria y programaci\u00f3n concurrente de estilo CSP f\u00e1cil de usar.<\/p>\n\n\n\n<p class=\"has-text-align-left\">Ejemplos <\/p>\n\n\n\n<p class=\"has-text-align-left\">\u00a1Hola Nicol\u00e1s!<\/p>\n\n\n\n<p class=\"has-text-align-left\">Coloque el siguiente c\u00f3digo en un nombre de archivo hola.go :<\/p>\n\n\n\n<p>package main<br>import \u00abfmt\u00bb<br>func main() {<\/p>\n\n\n\n<p>fmt.Println(\u00abHola Nicol\u00e1s\u00bb)<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>Cuando Go est\u00e1<a href=\"https:\/\/go.dev\/dl\/\"> instalado correctamente<\/a>, este programa se puede compilar y ejecutar de la<br>siguiente manera:<br>go run hola.go<\/p>\n\n\n\n<p class=\"has-text-align-left\">Una vez que est\u00e9 satisfecho con el c\u00f3digo, se puede compilar en un ejecutable ejecutando:<br>go build hola.go<\/p>\n\n\n\n<p class=\"has-text-align-left\"><br>Esto crear\u00e1 un archivo ejecutable adecuado para su sistema operativo en el directorio actual, que<br>luego puede ejecutar con el siguiente comando:<\/p>\n\n\n\n<p class=\"has-text-align-left\"><br>En Linux, OSX y otros sistemas similares a Unix:<br>.\/hola<\/p>\n\n\n\n<p class=\"has-text-align-left\"><br>En Windows:<br>hola.exe<\/p>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-left\"><a href=\"https:\/\/blog.codinghorror.com\/\">HORROR DE CODIFICACI\u00d3N<\/a><\/h1>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left\">programaci\u00f3n y factores humanos<\/h2>\n\n\n\n<p class=\"has-text-align-left\"><strong><span style=\"text-decoration: underline;\"><a href=\"https:\/\/blog.codinghorror.com\/why-cant-programmers-program\/\">FizzBuzz <\/a><\/span><\/strong><\/p>\n\n\n\n<p class=\"has-text-align-left\">Otro ejemplo de los programas de estilo \u00abHello World\u00bb es <a href=\"https:\/\/blog.codinghorror.com\/why-cant-programmers-program\/\">FizzBuzz<\/a> . Este es un ejemplo de una implementaci\u00f3n de<a href=\"https:\/\/blog.codinghorror.com\/why-cant-programmers-program\/\"> FizzBuzz<\/a>. Muy idiom\u00e1tico entra en juego aqu\u00ed. <\/p>\n\n\n\n<p class=\"has-text-align-left\">package main <\/p>\n\n\n\n<p class=\"has-text-align-left\">\/\/ Simple fizzbuzz implementation <\/p>\n\n\n\n<p class=\"has-text-align-left\">import \u00abfmt\u00bb <\/p>\n\n\n\n<p class=\"has-text-align-left\">func main() { <\/p>\n\n\n\n<p class=\"has-text-align-left\">for i := 1; i &lt;= 100; i++ { <\/p>\n\n\n\n<p class=\"has-text-align-left\">s := \u00ab\u00bb <\/p>\n\n\n\n<p class=\"has-text-align-left\">if i % 3 == 0 {<\/p>\n\n\n\n<p class=\"has-text-align-left\"> s += \u00abFizz\u00bb<\/p>\n\n\n\n<p class=\"has-text-align-left\">}<br>if i % 5 == 0 {<br>s += \u00abBuzz\u00bb<br>}<br>if s != \u00ab\u00bb {<br>fmt.Println(s)<br>} else {<br>fmt.Println(i)<br>}<br>}<br>}<\/p>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"530\" src=\"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/\/wp-content\/uploads\/2022\/08\/go_amex_case_study_logo-1024x530.png\" alt=\"\" class=\"wp-image-7947\" srcset=\"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-content\/uploads\/2022\/08\/go_amex_case_study_logo-1024x530.png 1024w, https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-content\/uploads\/2022\/08\/go_amex_case_study_logo-300x155.png 300w, https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-content\/uploads\/2022\/08\/go_amex_case_study_logo-768x397.png 768w, https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-content\/uploads\/2022\/08\/go_amex_case_study_logo.png 1160w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left\">Listado de variables de entorno de Go<\/h2>\n\n\n\n<p class=\"has-text-align-left\">Las variables de entorno que afectan a la herramienta go pueden verse a trav\u00e9s del comando go<br>env [var \u2026] :<\/p>\n\n\n\n<p class=\"has-text-align-left\">$ go env<br>GOARCH=\u00bbamd64&#8243;<br>GOBIN=\u00bb\/home\/yourname\/bin\u00bb<br>GOEXE=\u00bb\u00bb<br>GOHOSTARCH=\u00bbamd64&#8243;<br>GOHOSTOS=\u00bblinux\u00bb<br>GOOS=\u00bblinux\u00bb<br>GOPATH=\u00bb\/home\/yourname\u00bb<br>GORACE=\u00bb\u00bb<br>GOROOT=\u00bb\/usr\/lib\/go\u00bb<br>GOTOOLDIR=\u00bb\/usr\/lib\/go\/pkg\/tool\/linux_amd64&#8243;<br>CC=\u00bbgcc\u00bb<br>GOGCCFLAGS=\u00bb-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=\/tmp\/go-<br>build059426571=\/tmp\/go-build -gno-record-gcc-switches\u00bb<br>CXX=\u00bbg++\u00bb<br>CGO_ENABLED=\u00bb1&#8243;<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left\">Aplazar<\/h2>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<h2 class=\"wp-block-heading has-text-align-left\">Introducci\u00f3n<\/h2>\n\n\n\n<p class=\"has-text-align-left\">Una declaraci\u00f3n defer empuja una llamada de funci\u00f3n a una lista. La lista de llamadas guardadas<br>se ejecuta despu\u00e9s de que vuelve la funci\u00f3n que la rodea. El aplazamiento se usa com\u00fanmente<br>para simplificar las funciones que realizan varias acciones de limpieza.<\/p>\n\n\n\n<p class=\"has-text-align-left\">Sintaxis<br>\u2022 diferir someFunc (args)<br>\u2022 aplazar func () {\/\/ el c\u00f3digo va aqu\u00ed} ()<br>Observaciones<br>La funci\u00f3n de defer inyecta un nuevo marco de pila (la funci\u00f3n llamada despu\u00e9s de la palabra<br>clave de defer ) en la pila de llamadas debajo de la funci\u00f3n que se est\u00e1 ejecutando actualmente.<br>Esto significa que se garantiza que el aplazamiento se ejecute siempre que la pila se desenrolle<br>(si su programa falla o obtiene un SIGKILL , el aplazamiento no se ejecutar\u00e1).<br>Examples<br>Diferir lo b\u00e1sico<br>Una declaraci\u00f3n diferida en Go es simplem<\/p>\n\n\n\n<p class=\"has-text-align-left\">Una declaraci\u00f3n diferida en Go es simplemente una llamada de funci\u00f3n marcada para ejecutarse<br>en un momento posterior. La declaraci\u00f3n diferida es una llamada de funci\u00f3n ordinaria prefijada<br>por la palabra clave defer .<br>defer someFunction()<br>Una funci\u00f3n diferida se ejecuta una vez la funci\u00f3n que contiene los defer retorne el comando. La<br>llamada real a la funci\u00f3n diferida se produce cuando la funci\u00f3n de cierre:<br>\u2022 ejecuta una declaraci\u00f3n de retorno<br>\u2022 se cae del final<br>\u2022 p\u00e1nico<br>Ejemplo:<br>func main() {<br>fmt.Println(\u00abFirst main statement\u00bb)<br>defer logExit(\u00abmain\u00bb) \/\/ position of defer statement here does not matter<br>fmt.Println(\u00abLast main statement\u00bb)<br>}<br><\/p>\n\n\n\n<p class=\"has-text-align-left\">func logExit(name string) {<br>fmt.Printf(\u00abFunction %s returned\\n\u00bb, name)<br>}<br>Salida:<br>First main statement<br>Last main statement<br>Function main returned<br>Si una funci\u00f3n tiene varias declaraciones diferidas, forman una pila. El \u00faltimo defer es el primero<br>que se ejecuta despu\u00e9s de que se devuelve la funci\u00f3n de cierre, seguido de las llamadas<br>subsiguientes a los defer anteriores en orden (a continuaci\u00f3n, el ejemplo devuelve causando un<br>p\u00e1nico):<\/p>\n\n\n\n<p class=\"has-text-align-left\">func main() {<br>defer logNum(1)<br>fmt.Println(\u00abFirst main statement\u00bb)<br>defer logNum(2)<br>defer logNum(3)<br>panic(\u00abpanic occurred\u00bb)<br>fmt.Println(\u00abLast main statement\u00bb) \/\/ not printed<br>defer logNum(3) \/\/ not deferred since execution flow never reaches this line<br>}<br>func logNum(i int) {<br>fmt.Printf(\u00abNum %d\\n\u00bb, i)<br>}<br>Salida:<\/p>\n\n\n\n<p class=\"has-text-align-left\">First main statement<br>Num 3<br>Num 2<br>Num 1<br>panic: panic occurred<br>goroutine 1 [running]:<br>\u2026.<br>Tenga en cuenta que las funciones diferidos han evaluado sus argumentos en el momento defer<br>ejecuta:<\/p>\n\n\n\n<p class=\"has-text-align-left\">func main() {<br>i := 1<br>defer logNum(i) \/\/ deferred function call: logNum(1)<br>fmt.Println(\u00abFirst main statement\u00bb)<br>i++<br>defer logNum(i) \/\/ deferred function call: logNum(2)<br>defer logNum(i*i) \/\/ deferred function call: logNum(4)<br>return \/\/ explicit return<br>}<br>func logNum(i int) {<br>fmt.Printf(\u00abNum %d\\n\u00bb, i)<\/p>\n\n\n\n<p class=\"has-text-align-left\">}<br>Salida:<br>First main statement<br>Num 4<br>Num 2<br>Num 1<br>Si una funci\u00f3n ha nombrado valores de retorno, una funci\u00f3n an\u00f3nima diferida dentro de esa<br>funci\u00f3n puede acceder y actualizar el valor devuelto incluso despu\u00e9s de que la funci\u00f3n haya<br>regresado:<\/p>\n\n\n\n<p class=\"has-text-align-left\">func main() {<br>fmt.Println(plusOne(1)) \/\/ 2<br>return<br>}<br>func plusOne(i int) (result int) { \/\/ overkill! only for demonstration<br>defer func() {result += 1}() \/\/ anonymous function must be called by adding ()<br>\/\/ i is returned as result, which is updated by deferred function above<br>\/\/ after execution of below return<br>return i<br>}<\/p>\n\n\n\n<p class=\"has-text-align-left\">Finalmente, una sentencia de defer generalmente se usa en operaciones que a menudo ocurren<br>juntas Por ejemplo:<br>\u2022 abrir y cerrar un archivo<br>\u2022 conectar y desconectar<br>\u2022 bloquear y desbloquear un mutex<br>\u2022 marcar un grupo de espera como hecho ( defer wg.Done() )<br>Este uso garantiza la liberaci\u00f3n adecuada de los recursos del sistema independientemente del<br>flujo de ejecuci\u00f3n.<br>resp, err := http.Get(url)<br>if err != nil {<br>return err<br>}<br>defer resp.Body.Close() \/\/ Body will always get closed<\/p>\n\n\n\n<p class=\"has-text-align-left\">Llamadas de funci\u00f3n diferida<br>Las llamadas a funciones diferidas tienen un prop\u00f3sito similar a cosas como los bloques finally<br>en lenguajes como Java: aseguran que alguna funci\u00f3n se ejecutar\u00e1 cuando se devuelva la<br>funci\u00f3n externa, independientemente de si se produjo un error o qu\u00e9 declaraci\u00f3n de devoluci\u00f3n se<br>golpe\u00f3 en casos con m\u00faltiples devoluciones. Esto es \u00fatil para limpiar recursos que deben cerrarse<br>como conexiones de red o punteros de archivos. La palabra clave defer indica una llamada a<br>funci\u00f3n diferida, de manera similar a la palabra clave go inicia una nueva goroutina. Al igual que<\/p>\n\n\n\n<p class=\"has-text-align-left\">una llamada go , los argumentos de la funci\u00f3n se eval\u00faan inmediatamente, pero a diferencia de la<br>llamada go , las funciones diferidas no se ejecutan simult\u00e1neamente.<br>func MyFunc() {<br>conn := GetConnection()<br>\/\/ Some kind of connection that must be closed.<br>defer conn.Close()<br>\/\/ Will be executed when MyFunc returns, regardless of how.<br>\/\/ Do some things\u2026<br>if someCondition {<br>return<br>\/\/ conn.Close() will be called<br>}<br>\/\/ Do more things<br>}\/\/ Implicit return &#8211; conn.Close() will still be called<br>Tenga en cuenta el uso de conn.Close() lugar de conn.Close : no solo est\u00e1 pasando una funci\u00f3n,<br>est\u00e1 aplazando una llamada de funci\u00f3n completa, incluidos sus argumentos. Las m\u00faltiples<br>llamadas de funci\u00f3n se pueden diferir en la misma funci\u00f3n externa, y cada una se ejecutar\u00e1 una<br>vez en orden inverso. Tambi\u00e9n puede aplazar los cierres, \u00a1no se olvide de los parens!<br>defer func(){<br>\/\/ Do some cleanup<br>}()<\/p>\n<\/div><\/div>\n\n\n\n<p class=\"has-text-align-left\">Archivo I \/ O<br>Sintaxis<\/p>\n\n\n\n<p class=\"has-text-align-left\">\u2022 archivo, err: = os.Open ( nombre ) \/\/ Abre un archivo en modo de solo lectura. Se devuelve<br>un error no nulo si no se pudo abrir el archivo.<br>\u2022 archivo, err: = os.Create ( nombre ) \/\/ Crea o abre un archivo si ya existe en modo de solo<br>escritura. El archivo se sobrescribe si ya existe. Se devuelve un error no nulo si no se pudo<br>abrir el archivo.<br>\u2022 file, err: = os.OpenFile ( name , flags , perm ) \/\/ Abre un archivo en el modo especificado por<br>las banderas. Se devuelve un error no nulo si no se pudo abrir el archivo.<br>\u2022 data, err: = ioutil.ReadFile ( name ) \/\/ Lee todo el archivo y lo devuelve. Se devuelve un error<br>no nulo si no se pudo leer el archivo completo.<br>\u2022 err: = ioutil.WriteFile ( name , data , perm ) \/\/ Crea o sobrescribe un archivo con los datos<br>proporcionados y los bits de permiso de UNIX. Se devuelve un error no nulo si el archivo no<br>se pudo escribir.<br>\u2022 err: = os.Remove ( name ) \/\/ Borra un archivo. Se devuelve un error no nulo si el archivo no<br>se pudo eliminar.<br>\u2022 err: = os.RemoveAll ( name ) \/\/ Borra un archivo o toda la jerarqu\u00eda de directorios. Se<br>devuelve un error no nulo si no se pudo eliminar el archivo o directorio.<br>\u2022 err: = os.Rename ( oldName , newName ) \/\/ Renombra o mueve un archivo (puede ser a<br>trav\u00e9s de directorios). Se devuelve un error no nulo si el archivo no se pudo mover.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left\">Leer y escribir en un archivo usando ioutil.<\/h2>\n\n\n\n<p class=\"has-text-align-left\">Un programa simple que escribe \u00ab\u00a1Hola mundo!\u00bb to test.txt , lee los datos y los imprime.<br>Demuestra operaciones simples de E \/ S de archivos.<\/p>\n\n\n\n<p class=\"has-text-align-left\">package main<br>import (<br>\u00abfmt\u00bb<br>\u00abio\/ioutil\u00bb<br>)<br>func main() {<br>hello := []byte(\u00abHello, world!\u00bb)<br>\/\/ Write <code>Hello, world!<\/code> to test.txt that can read\/written by user and read by others<br>err := ioutil.WriteFile(\u00abtest.txt\u00bb, hello, 0644)<br>if err != nil {<br>panic(err)<br>}<br>\/\/ Read test.txt<br>data, err := ioutil.ReadFile(\u00abtest.txt\u00bb)<br>if err != nil {<br>panic(err)<br>}<br>\/\/ Should output: <code>The file contains: Hello, world!<\/code><br>fmt.Println(\u00abThe file contains: \u00bb + string(data))<br>}<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left\">Listado de todos los archivos y carpetas en el directorio actual.<\/h2>\n\n\n\n<p class=\"has-text-align-left\">package main<br>import (<br>\u00abfmt\u00bb<br>\u00abio\/ioutil\u00bb<br>)<br>func main() {<br>files, err := ioutil.ReadDir(\u00ab.\u00bb)<br>if err != nil {<br>panic(err)<\/p>\n\n\n\n<p class=\"has-text-align-left\">}<br>fmt.Println(\u00abFiles and folders in the current directory:\u00bb)<br>for _, fileInfo := range files {<br>fmt.Println(fileInfo.Name())<br>}<br>}<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left\">Listado de todas las carpetas en el directorio actual<\/h2>\n\n\n\n<p class=\"has-text-align-left\">package main<br>import (<br>\u00abfmt\u00bb<br>\u00abio\/ioutil\u00bb<br>)<br>func main() {<br>files, err := ioutil.ReadDir(\u00ab.\u00bb)<br>if err != nil {<br>panic(err)<br>}<br>fmt.Println(\u00abFolders in the current directory:\u00bb)<br>for _, fileInfo := range files {<br>if fileInfo.IsDir() {<br>fmt.Println(fileInfo.Name())<br>}<br>}<br>}<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"320\" height=\"202\" src=\"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/\/wp-content\/uploads\/2022\/07\/gopher.jpg\" alt=\"\" class=\"wp-image-7888\" srcset=\"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-content\/uploads\/2022\/07\/gopher.jpg 320w, https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-content\/uploads\/2022\/07\/gopher-300x189.jpg 300w\" sizes=\"(max-width: 320px) 100vw, 320px\" \/><figcaption class=\"wp-element-caption\">Golang<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left\">Arrays<\/h2>\n\n\n\n<p class=\"has-text-align-left\">Introducci\u00f3n<br>Las matrices son tipos de datos espec\u00edficos, que representan una colecci\u00f3n ordenada de<br>elementos de otro tipo.<br>En Go, los arreglos pueden ser simples (a veces llamados \u00ablistas\u00bb) o multidimensionales (como,<br>por ejemplo, un arreglo en 2 dimensiones representa un conjunto ordenado de arreglos, que<br>contiene elementos)<br>Sintaxis<br>\u2022 var variableName [5] ArrayType \/\/ Declarar una matriz de tama\u00f1o 5.<br>var variableName [2] [3] ArrayType = {{Value1, Value2, Value3}, {Value4, Value5, Value6}} \/\/<br>Declarar una matriz multidimensional<br>\u2022<br>variableName: = [\u2026] ArrayType {Value1, Value2, Value3} \/\/ Declarar una matriz de tama\u00f1o 3<br>(El compilador contar\u00e1 los elementos de la matriz para definir el tama\u00f1o)<br>\u2022<br>\u2022 arrayName [2] \/\/ Obteniendo el valor por \u00edndice.<br>\u2022 arrayName [5] = 0 \/\/ Estableciendo el valor en el \u00edndice.<br>\u2022 arrayName [0] \/\/ Primer valor de la matriz<br>\u2022 arrayName [len (arrayName) -1] \/\/ \u00daltimo valor de la matriz<br>Examples<br>Creando matrices<br>Una matriz en go es una colecci\u00f3n ordenada de elementos del mismo tipo.<br>La notaci\u00f3n b\u00e1sica para representar arrays es usar [] con el nombre de la variable.<br>Crear una nueva matriz se parece a var array = [size]Type , reemplazando size por un n\u00famero<br>(por ejemplo, 42 para especificar que ser\u00e1 una lista de 42 elementos), y reemplazando Type por el<br>tipo de elementos que la matriz puede contener (para ejemplo int o string )<br>Justo debajo, hay un ejemplo de c\u00f3digo que muestra la forma diferente de crear una matriz en<br>Go.<br>\/\/ Creating arrays of 6 elements of type int,<br>\/\/ and put elements 1, 2, 3, 4, 5 and 6 inside it, in this exact order:<br>var array1 [6]int = [6]int {1, 2, 3, 4, 5, 6} \/\/ classical way<br>var array2 = [6]int {1, 2, 3, 4, 5, 6} \/\/ a less verbose way<br>var array3 = [\u2026]int {1, 2, 3, 4, 5, 6} \/\/ the compiler will count the array elements by<br>itself<br>fmt.Println(\u00abarray1:\u00bb, array1) \/\/ &gt; [1 2 3 4 5 6]<br>fmt.Println(\u00abarray2:\u00bb, array2) \/\/ &gt; [1 2 3 4 5 6]<br>fmt.Println(\u00abarray3:\u00bb, array3) \/\/ &gt; [1 2 3 4 5 6]<\/p>\n\n\n\n<p class=\"has-text-align-left\">\/\/ Creating arrays with default values inside: zeros := [8]int{} \/\/ Create a list of 8 int filled with 0 ptrs := [8]*int{} \/\/ a list of int pointers, filled with 8 nil references ( ) emptystr := [8]string{} \/\/ a list of string filled with 8 times \u00ab\u00bb fmt.Println(\u00abzeroes:\u00bb, zeros) \/\/ &gt; [0 0 0 0 0 0 0 0] fmt.Println(\u00abptrs:\u00bb, ptrs) \/\/ &gt; [ ] fmt.Println(\u00abemptystr:\u00bb, emptystr) \/\/ &gt; [ ] \/\/ <\/p>\n\n\n\n<p class=\"has-text-align-left\">values are empty strings, separated by spaces, \/\/ so we can just see separating spaces \/\/ Arrays are also working with a personalized type type Data struct { Number int Text string } \/\/ Creating an array with 8 &#8216;Data&#8217; elements \/\/ All the 8 elements will be like {0, \u00ab\u00bb} (Number = 0, Text = \u00ab\u00bb) structs := [8]Data{} fmt.Println(\u00abstructs:\u00bb, structs) \/\/ &gt; [{0 } {0 } {0 } {0 } {0 } {0 } {0 } {0 }] \/\/ prints {0 } because Number are 0 and Text are empty; separated by a space jugar en el patio de recreo Array Multidimensional Las matrices multidimensionales son b\u00e1sicamente matrices que contienen otras matrices como elementos. Se representa como el tipo [sizeDim1][sizeDim2]..[sizeLastDim]type , reemplazando sizeDim por n\u00fameros correspondientes a la longitud de la dimensi\u00f3n, y type por el tipo de datos en la matriz multidimensional.<\/p>\n\n\n\n<p class=\"has-text-align-left\"> Por ejemplo, [2][3]int representa una matriz compuesta de 2 subrays de 3 elementos tipeados int . B\u00e1sicamente puede ser la representaci\u00f3n de una matriz de 2 l\u00edneas y 3 columnas . Por lo tanto, podemos hacer una matriz num\u00e9rica de grandes dimensiones como var values := [2017][12][31][24][60]int por ejemplo, si necesita almacenar un n\u00famero por cada minuto desde el a\u00f1o 0. <\/p>\n\n\n\n<p class=\"has-text-align-left\">Para acceder a este tipo de matriz, para el \u00faltimo ejemplo, buscando el valor de 2016-01-31 a las 19:42, tendr\u00e1 acceso a los values[2016][0][30][19][42] (porque los \u00edndices de matriz comienza a 0 y no a 1 como d\u00edas y meses) Algunos ejemplos siguientes: \/\/ Defining a 2d Array to represent a matrix like \/\/ 1 2 3 So with 2 lines and 3 columns;<\/p>\n\n\n\n<p class=\"has-text-align-left\">\/\/ 4 5 6<br>var multiDimArray := [2\/<em>lines<\/em>\/][3\/<em>columns<\/em>\/]int{ [3]int{1, 2, 3}, [3]int{4, 5, 6} }<br>\/\/ That can be simplified like this:<br>var simplified := [2][3]int{{1, 2, 3}, {4, 5, 6}}<br>\/\/ What does it looks like ?<br>fmt.Println(multiDimArray)<br>\/\/ &gt; [[1 2 3] [4 5 6]]<br>fmt.Println(multiDimArray[0])<br>\/\/ &gt; [1 2 3] (first line of the array)<br>fmt.Println(multiDimArray[0][1])<br>\/\/ &gt; 2 (cell of line 0 (the first one), column 1 (the 2nd one))<br>\/\/ We can also define array with as much dimensions as we need<br>\/\/ here, initialized with all zeros<br>var multiDimArray := [2][4][3][2]string{}<br>fmt.Println(multiDimArray);<br>\/\/ Yeah, many dimensions stores many data<br>\/\/ &gt; [[[[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]]]<br>\/\/ [[[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]]]<br>\/\/ [[[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]]]<br>\/\/ [[[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]]]]<br>\/\/ [[[[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]]]<br>\/\/ [[[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]]]<br>\/\/ [[[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]]]<br>\/\/ [[[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]]]]<br>\/\/ We can set some values in the array&#8217;s cells<br>multiDimArray[0][0][0][0] := \u00abAll zero indexes\u00bb \/\/ Setting the first value<br>multiDimArray[1][3][2][1] := \u00abAll indexes to max\u00bb \/\/ Setting the value at extreme location<br>fmt.Println(multiDimArray);<br>\/\/ If we could see in 4 dimensions, maybe we could see the result as a simple format<br>\/\/ &gt; [[[[\u00abAll zero indexes\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]]]<br>\/\/ [[[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]]]<br>\/\/ [[[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]]]<br>\/\/ [[[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]]]]<br>\/\/ [[[[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]]]<br>\/\/ [[[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]]]<br>\/\/ [[[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]]]<br>\/\/ [[[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00ab\u00bb]] [[\u00ab\u00bb \u00ab\u00bb] [\u00ab\u00bb \u00abAll indexes to max\u00bb]]]]<br>\u00cdndices de matriz<br>Se debe acceder a los valores de las matrices utilizando un n\u00famero que especifique la ubicaci\u00f3n<br>del valor deseado en la matriz. Este n\u00famero se llama \u00edndice.<br>Los \u00edndices comienzan en 0 y terminan en longitud de matriz -1 .<br>Para acceder a un valor, debe hacer algo como esto: arrayName[index] , reemplazando \u00ab\u00edndice\u00bb por<br>el n\u00famero correspondiente al rango del valor en su matriz.<\/p>\n\n\n\n<p class=\"has-text-align-left\">Por ejemplo:<br>var array = [6]int {1, 2, 3, 4, 5, 6}<br>fmt.Println(array[-42]) \/\/ invalid array index -1 (index must be non-negative)<br>fmt.Println(array[-1]) \/\/ invalid array index -1 (index must be non-negative)<br>fmt.Println(array[0]) \/\/ &gt; 1<br>fmt.Println(array[1]) \/\/ &gt; 2<br>fmt.Println(array[2]) \/\/ &gt; 3<br>fmt.Println(array[3]) \/\/ &gt; 4<br>fmt.Println(array[4]) \/\/ &gt; 5<br>fmt.Println(array[5]) \/\/ &gt; 6<br>fmt.Println(array[6]) \/\/ invalid array index 6 (out of bounds for 6-element array)<br>fmt.Println(array[42]) \/\/ invalid array index 42 (out of bounds for 6-element array)<br>Para establecer o modificar un valor en la matriz, la forma es la misma.<br>Ejemplo:<br>var array = [6]int {1, 2, 3, 4, 5, 6}<br>fmt.Println(array) \/\/ &gt; [1 2 3 4 5 6]<br>array[0] := 6<br>fmt.Println(array) \/\/ &gt; [6 2 3 4 5 6]<br>array[1] := 5<br>fmt.Println(array) \/\/ &gt; [6 5 3 4 5 6]<br>array[2] := 4<br>fmt.Println(array) \/\/ &gt; [6 5 4 4 5 6]<br>array[3] := 3<br>fmt.Println(array) \/\/ &gt; [6 5 4 3 5 6]<br>array[4] := 2<br>fmt.Println(array) \/\/ &gt; [6 5 4 3 2 6]<br>array[5] := 1<br>fmt.Println(array) \/\/ &gt; [6 5 4 3 2 1]<br>Lea Arrays en l\u00ednea: https:\/\/riptutorial.com\/es\/go\/topic\/390\/arrays<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left\">Autorizaci\u00f3n JWT en G<\/h2>\n\n\n\n<p class=\"has-text-align-left\">Introducci\u00f3n<br>Los tokens web de JSON (JWT) son un m\u00e9todo popular para representar reclamos de forma<br>segura entre dos partes. Comprender c\u00f3mo trabajar con ellos es importante al desarrollar<br>aplicaciones web o interfaces de programaci\u00f3n de aplicaciones.<br>Observaciones<br>context.Context y HTTP middleware est\u00e1n fuera del alcance de este tema, pero no obstante, esas<br>almas curiosas y errantes deber\u00edan consultar https:\/\/github.com\/goware\/jwtauth ,<br>https:\/\/github.com\/auth0\/go-jwt- middleware , y https:\/\/github.com\/dgrijalva\/jwt-go .<br>Grandes felicitaciones a Dave Grijalva por su incre\u00edble trabajo en go-jwt.<br>Examples<br>Analizar y validar un token utilizando el m\u00e9todo de firma HMAC<br>\/\/ sample token string taken from the New example<br>tokenString :=<br>\u00abeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJuYmYiOjE0NDQ0Nzg0MDB9.u1riaD1rW97opCoAuRCTy4w58Br\u0002Zk-bh7vLiRIsrpU\u00bb<br>\/\/ Parse takes the token string and a function for looking up the key. The latter is<br>especially<br>\/\/ useful if you use multiple keys for your application. The standard is to use &#8216;kid&#8217; in the<br>\/\/ head of the token to identify which key to use, but the parsed token (head and claims) is<br>provided<br>\/\/ to the callback, providing flexibility.<br>token, err := jwt.Parse(tokenString, func(token <em>jwt.Token) (interface{}, error) { \/\/ Don&#8217;t forget to validate the alg is what you expect: if _, ok := token.Method.(<\/em>jwt.SigningMethodHMAC); !ok {<br>return nil, fmt.Errorf(\u00abUnexpected signing method: %v\u00bb, token.Header[\u00abalg\u00bb])<br>}<br>\/\/ hmacSampleSecret is a []byte containing your secret, e.g. []byte(\u00abmy_secret_key\u00bb)<br>return hmacSampleSecret, nil<br>})<br>if claims, ok := token.Claims.(jwt.MapClaims); ok &amp;&amp; token.Valid {<br>fmt.Println(claims[\u00abfoo\u00bb], claims[\u00abnbf\u00bb])<br>} else {<br>fmt.Println(err)<br>}<br>Salida:<br>bar 1.4444784e+09<\/p>\n\n\n\n<p class=\"has-text-align-left\">(De la documentaci\u00f3n , cortes\u00eda de Dave Grijalva.) Creaci\u00f3n de un token utilizando un tipo de notificaciones personalizado El StandardClaim est\u00e1 integrado en el tipo personalizado para permitir la f\u00e1cil codificaci\u00f3n, an\u00e1lisis y validaci\u00f3n de las reclamaciones est\u00e1ndar. <\/p>\n\n\n\n<p class=\"has-text-align-left\">tokenString := \u00abeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJleHAiOjE1MDAwLCJpc3MiOiJ0ZXN0In0.HE7fK0xOQwFEr4WDgRWj4teRPZ6i3GLwD5YCm6Pwu_c\u00bb type MyCustomClaims struct { Foo string `json:\u00bbfoo\u00bb` jwt.StandardClaims } \/\/ sample token is expired. override time so it parses as valid at(time.Unix(0, 0), func() { token, err := jwt.ParseWithClaims(tokenString, &amp;MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) { return []byte(\u00abAllYourBase\u00bb), nil }) if claims, ok := token.Claims.(*MyCustomClaims); ok &amp;&amp; token.Valid { fmt.Printf(\u00ab%v %v\u00bb, claims.Foo, claims.StandardClaims.ExpiresAt) } else { fmt.Println(err) } }) Salida: bar 15000<\/p>\n\n\n\n<p class=\"has-text-align-left\"> (De la documentaci\u00f3n , cortes\u00eda de Dave Grijalva.) Creaci\u00f3n, firma y codificaci\u00f3n de un token JWT utilizando el m\u00e9todo de firma HMAC \/\/ Create a new token object, specifying signing method and the claims \/\/ you would like it to contain. token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ \u00abfoo\u00bb: \u00abbar\u00bb, \u00abnbf\u00bb: time.Date(2015, 10, 10, 12, 0, 0, 0, time.UTC).Unix(), }) \/\/ Sign and get the complete encoded token as a string using the secret tokenString, err := token.SignedString(hmacSampleSecret) fmt.Println(tokenString, err) Salida: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJuYmYiOjE0NDQ0Nzg0MDB9.u1riaD1rW97opCoAuRCTy4w58Br\u0002<\/p>\n\n\n\n<p class=\"has-text-align-left\"> Zk-bh7vLiRIsrpU (De la documentaci\u00f3n , cortes\u00eda de Dave Grijalva.)<\/p>\n\n\n\n<p class=\"has-text-align-left\"> Usando el tipo StandardClaims por s\u00ed mismo para analizar un token El tipo StandardClaims est\u00e1 dise\u00f1ado para ser integrado en sus tipos personalizados para proporcionar caracter\u00edsticas de validaci\u00f3n est\u00e1ndar.<\/p>\n\n\n\n<p class=\"has-text-align-left\"> Puede usarlo solo, pero no hay forma de recuperar otros campos despu\u00e9s de analizar. <\/p>\n\n\n\n<p class=\"has-text-align-left\">Vea el ejemplo de reclamos personalizados para el uso previsto.<\/p>\n\n\n\n<p class=\"has-text-align-left\"> mySigningKey := []byte(\u00abAllYourBase\u00bb)<\/p>\n\n\n\n<p class=\"has-text-align-left\"> \/\/ Create the Claims claims := &amp;jwt.StandardClaims{ ExpiresAt: 15000, Issuer: \u00abtest\u00bb, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) ss, err := token.SignedString(mySigningKey) fmt.Printf(\u00ab%v %v\u00bb, ss, err) Salida: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MDAwLCJpc3MiOiJ0ZXN0In0.QsODzZu3lUZMVdhbO76u3Jv02iYCvEHcYVUI1kOWEU0 (De la documentaci\u00f3n , cortes\u00eda de Dave Grijalva.) Analizar los tipos de error usando cheques de campo de bits \/\/ Token from another example. This token is expired var tokenString = \u00abeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJleHAiOjE1MDAwLCJpc3MiOiJ0ZXN0In0.HE7fK0xOQwFEr4WDgRWj4teRPZ6i3GLwD5YCm6Pwu_c\u00bb token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { return []byte(\u00abAllYourBase\u00bb), nil }) if token.Valid { fmt.Println(\u00abYou look nice today\u00bb) } else if ve, ok := err.(*jwt.ValidationError); <\/p>\n\n\n\n<p class=\"has-text-align-left\">ok { if ve.Errors&amp;jwt.ValidationErrorMalformed != 0 { fmt.Println(\u00abThat&#8217;s not even a token\u00bb) } else if ve.Errors&amp;(jwt.ValidationErrorExpired|jwt.ValidationErrorNotValidYet) != 0 { \/\/ Token is either expired or not active yet fmt.Println(\u00abTiming is everything\u00bb) } else { fmt.Println(\u00abCouldn&#8217;t handle this token:\u00bb, err) } } else { fmt.Println(\u00abCouldn&#8217;t handle this token:\u00bb, err) https:\/\/riptutorial.com\/es\/home 26 } Salida: Timing is everything (De la documentaci\u00f3n , cortes\u00eda de Dave Grijalva.) <\/p>\n\n\n\n<p class=\"has-text-align-left\">Obteniendo el token del encabezado de autorizaci\u00f3n HTTP type contextKey string const ( \/\/ JWTTokenContextKey holds the key used to store a JWT Token in the \/\/ context. JWTTokenContextKey contextKey = \u00abJWTToken\u00bb \/\/ JWTClaimsContextKey holds the key used to store the JWT Claims in the \/\/ context. JWTClaimsContextKey contextKey = \u00abJWTClaims\u00bb ) \/\/ ToHTTPContext moves JWT token from request header to context. func ToHTTPContext() http.RequestFunc { return func(ctx context.Context, r *stdhttp.Request) context.Context { token, ok := extractTokenFromAuthHeader(r.Header.Get(\u00abAuthorization\u00bb)) if !ok { return ctx } return context.WithValue(ctx, JWTTokenContextKey, token) } }<\/p>\n\n\n\n<p class=\"has-text-align-left\"> (De go-kit \/ kit , cortes\u00eda de Peter Bourgon) <\/p>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left\">Bucles<\/h2>\n\n\n\n<p>Introducci\u00f3n <\/p>\n\n\n\n<p class=\"has-text-align-left\">Como una de las funciones m\u00e1s b\u00e1sicas de la programaci\u00f3n, los bucles son una pieza importante para casi todos los lenguajes de programaci\u00f3n. Los bucles permiten a los desarrolladores configurar ciertas partes de su c\u00f3digo para que se repitan a trav\u00e9s de una serie de bucles que se conocen como iteraciones. Este tema cubre el uso de varios tipos de bucles y aplicaciones de bucles en Go. <\/p>\n\n\n\n<p>Examples<\/p>\n\n\n\n<p class=\"has-text-align-left\"> Lazo basico<\/p>\n\n\n\n<p class=\"has-text-align-left\"> for es la \u00fanica sentencia de bucle en marcha, por lo que una implementaci\u00f3n b\u00e1sica de bucle podr\u00eda tener este aspecto:<\/p>\n\n\n\n<p class=\"has-text-align-left\"> \/\/ like if, for doesn&#8217;t use parens either. \/\/ variables declared in for and if are local to their scope. for x := 0; x &lt; 3; x++ { \/\/ ++ is a statement. fmt.Println(\u00abiteration\u00bb, x) } \/\/ would print: \/\/ iteration 0 \/\/ iteration 1 \/\/ iteration 2 <\/p>\n\n\n\n<p class=\"has-text-align-left\">Romper y continuar <\/p>\n\n\n\n<p>Salir del bucle y continuar a la siguiente iteraci\u00f3n tambi\u00e9n se admite en Go, como en muchos otros idiomas: <\/p>\n\n\n\n<p>for x := 0; x &lt; 10; x++ { \/\/ loop through 0 to 9 if x &lt; 3 { \/\/ skips all the numbers before 3 continue } if x &gt; 5 { \/\/ breaks out of the loop once x == 6 break } fmt.Println(\u00abiteration\u00bb, x) } \/\/ would print: \/\/ iteration 3 \/\/ iteration 4 \/\/ iteration 5<\/p>\n\n\n\n<p> Las declaraciones break y continue adem\u00e1s aceptan una etiqueta opcional, que se utiliza para<\/p>\n\n\n\n<p class=\"has-text-align-left\">identificar los bucles externos para apuntar con la declaraci\u00f3n:<\/p>\n\n\n\n<p class=\"has-text-align-left\"> OuterLoop: for { for { if allDone() { break OuterLoop } if innerDone() { continue OuterLoop } \/\/ do something } }<\/p>\n\n\n\n<p class=\"has-text-align-left\"> Bucle condicional<\/p>\n\n\n\n<p class=\"has-text-align-left\"> La palabra clave for tambi\u00e9n se usa para los bucles condicionales, tradicionalmente while bucles en otros lenguajes de programaci\u00f3n. <\/p>\n\n\n\n<p class=\"has-text-align-left\">package main import ( \u00abfmt\u00bb ) func main() { i := 0 for i &lt; 3 { \/\/ Will repeat if condition is true i++ fmt.Println(i) } } <\/p>\n\n\n\n<p class=\"has-text-align-left\"> Saldr\u00e1: 1 2 3<\/p>\n\n\n\n<p class=\"has-text-align-left\"> Bucle infinito:<\/p>\n\n\n\n<p class=\"has-text-align-left\"> for { \/\/ This will run until a return or break. } <\/p>\n\n\n\n<p class=\"has-text-align-left\">Diferentes formas de For Loop <\/p>\n\n\n\n<p class=\"has-text-align-left\">Forma simple utilizando una variable: <\/p>\n\n\n\n<p class=\"has-text-align-left\">for i := 0; i &lt; 10; i++ {<\/p>\n\n\n\n<p class=\"has-text-align-left\">fmt.Print(i, \u00bb \u00ab)<br>}<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left\">Usando dos variables (o m\u00e1s):<\/h2>\n\n\n\n<p class=\"has-text-align-left\">for i, j := 0, 0; i &lt; 5 &amp;&amp; j &lt; 10; i, j = i+1, j+2 { fmt.Println(i, j) }<\/p>\n\n\n\n<p class=\"has-text-align-left\">Etc,etc,&#8230;<\/p>\n\n\n\n<p class=\"has-text-align-left\">Y mucho m\u00e1s &#8230;<\/p>\n\n\n\n<p class=\"has-text-align-left\">Puedes ver el Documento entero Pinchando<a href=\"https:\/\/nicol\u00e1s.es\/producto\/aprendizaje-go-en-pdf\/\"> Aqui<\/a><a href=\"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/\/enlaces-entradas\/go-es.pdf\">.<\/a><\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-text-align-left\"><strong>\u00a1Cu\u00e9ntame en los comentarios!<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-text-align-left\"><strong>Enlaces internos:<\/strong><\/p>\n\n\n\n<h5 class=\"wp-block-heading has-text-align-left\"><a href=\"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/\/nicolas_noticias\/\">\u00daltimas Noticias Digitales<\/a><\/h5>\n\n\n\n<h5 class=\"wp-block-heading has-text-align-left\"><a href=\"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/\/blog\/\">Blog<\/a><\/h5>\n\n\n\n<h5 class=\"wp-block-heading has-text-align-left\"><a href=\"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/\/tienda\/\">Tienda<\/a><\/h5>\n\n\n\n<h4 class=\"wp-block-heading has-text-align-left\">S\u00ed, te ha Gustado.<\/h4>\n\n\n\n<p class=\"has-text-align-left\"><strong>\u00a1Cu\u00e9ntame en los comentarios!<\/strong><\/p>\n\n\n\n<p class=\"has-text-align-left\"><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Go es un lenguaje de c\u00f3digo abierto, compilado y tipificado est\u00e1ticamente seg\u00fan la tradici\u00f3n de<br \/>\nAlgol y C. Cuenta con caracter\u00edsticas como recolecci\u00f3n de basura, tipificaci\u00f3n estructural limitada,<br \/>\nfunciones de seguridad de la memoria y programaci\u00f3n concurrente de estilo CSP f\u00e1cil de usar.<\/p>\n","protected":false},"author":2,"featured_media":7888,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[65,66,6],"tags":[67],"class_list":["post-7921","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cursos","category-golang","category-programacion-informatica","tag-golang"],"_links":{"self":[{"href":"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-json\/wp\/v2\/posts\/7921","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-json\/wp\/v2\/comments?post=7921"}],"version-history":[{"count":1,"href":"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-json\/wp\/v2\/posts\/7921\/revisions"}],"predecessor-version":[{"id":12616,"href":"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-json\/wp\/v2\/posts\/7921\/revisions\/12616"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-json\/wp\/v2\/media\/7888"}],"wp:attachment":[{"href":"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-json\/wp\/v2\/media?parent=7921"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-json\/wp\/v2\/categories?post=7921"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/xn--nicols-tta.es\/temas_y_plugins\/nicopre\/wp-json\/wp\/v2\/tags?post=7921"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}