informatica:programacion:go
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| informatica:programacion:go [2021/08/31 09:53] – [Creación] tempwin | informatica:programacion:go [2023/08/31 09:59] (actual) – [Linux manual] tempwin | ||
|---|---|---|---|
| Línea 16: | Línea 16: | ||
| * [[https:// | * [[https:// | ||
| * Compilación cruzada: poder compilar en diferentes sistemas y hacia cualquier sistema. | * Compilación cruzada: poder compilar en diferentes sistemas y hacia cualquier sistema. | ||
| + | * Manejo muy eficiente de concurrencia | ||
| Go te obliga a mantener el código limpio. Si declaras la importación de un paquete y no lo usas, Go se quejará y no compilará: | Go te obliga a mantener el código limpio. Si declaras la importación de un paquete y no lo usas, Go se quejará y no compilará: | ||
| Línea 174: | Línea 175: | ||
| </ | </ | ||
| - | Comprobamos: | + | Comprobamos |
| < | < | ||
| $ go version | $ go version | ||
| - | go version go1.15.5 linux/amd64 | + | go version go1.20.3 linux/amd64 |
| </ | </ | ||
| Línea 217: | Línea 218: | ||
| < | < | ||
| - | go version go1.17 linux/amd64 | + | go version go1.21.0 linux/amd64 |
| </ | </ | ||
| ===== Configuración ===== | ===== Configuración ===== | ||
| Línea 728: | Línea 729: | ||
| <WRAP center round important 60%> | <WRAP center round important 60%> | ||
| Las variables declaradas deben ser usadas o Go se quejará. | Las variables declaradas deben ser usadas o Go se quejará. | ||
| + | </ | ||
| + | |||
| + | <WRAP center round info 60%> | ||
| + | Las buenas prácticas de Go indican que la nomenclatura de las variables debe ser camelCase | ||
| </ | </ | ||
| Línea 1081: | Línea 1086: | ||
| </ | </ | ||
| + | ===== Funciones ===== | ||
| + | |||
| + | Bloques de código reutilizables. | ||
| + | |||
| + | Para definir una función se utiliza la palabra reservada '' | ||
| + | |||
| + | <code go> | ||
| + | func suma(a int, b int) int { | ||
| + | return a + b | ||
| + | } | ||
| + | </ | ||
| ===== Documentación ===== | ===== Documentación ===== | ||
| Línea 2043: | Línea 2059: | ||
| palabras := strings. Fields(" | palabras := strings. Fields(" | ||
| - | for i, v := range words { | + | for i, v := range palabras |
| < | < | ||
| } | } | ||
| Línea 2170: | Línea 2186: | ||
| <code go> | <code go> | ||
| package main | package main | ||
| + | |||
| + | import " | ||
| type Mascota struct { | type Mascota struct { | ||
| Línea 2188: | Línea 2206: | ||
| }, | }, | ||
| } | } | ||
| + | | ||
| + | fmt.Println(misMascotas) | ||
| } | } | ||
| </ | </ | ||
| Línea 2237: | Línea 2257: | ||
| </ | </ | ||
| + | ===== Interface ===== | ||
| + | |||
| + | Tipo de dato no concreto. | ||
| + | |||
| + | Los tipos **structs** indican qué es algo mientras que los tipos de datos **interface** indican qué puede hacer. | ||
| + | |||
| + | <WRAP center round todo 60%> | ||
| + | Completar la explicación con ejemplos claros | ||
| + | </ | ||
| + | |||
| + | ===== Goroutines y channels ===== | ||
| + | |||
| + | Mucha de la programación que se hace es secuencial. Las rutinas de Go y los canales permiten realizar operaciones mientras otro código está en ejecución. Son como los hilos. | ||
| + | |||
| + | Los canales se comunican entre las rutinas de go. Las rutinas necesitan comunicarse para saber cuándo finalizan y saber si deben detenerse o continuar. | ||
| + | |||
| + | Un ejemplo de uso sería una rutina para leer varios ficheros. En lugar de abrir uno, leer todo el contenido, cerrar el fichero y proceder con el siguiente, se puede hacer todo esto al mismo tiempo. Los canales pueden avisar cuándo se ha terminado de leer todos los ficheros. | ||
| + | |||
| + | Otro ejemplo sería contar la duración de la ejecución de una función. Se podría lanzar una goroutine con un contador de tiempo para que guarde la duración de la función. Estos dos procesos se ejecutan a la vez y uno de ellos está esperando a que el otro termine. | ||
| + | |||
| + | <code go> | ||
| + | func goRoutinesAndChannels() { | ||
| + | files := []string{ | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | | ||
| + | rowChannel := make(chan int, len(files)) | ||
| + | | ||
| + | for _, file := range files { | ||
| + | file := file // this is stupid, but we have to because closures. big go pitfall! | ||
| + | | ||
| + | go func() { | ||
| + | numRows, err := countRows(file) | ||
| + | if err != nil { | ||
| + | panic(" | ||
| + | } | ||
| + | | ||
| + | rowChannel <- numRows | ||
| + | }() | ||
| + | } | ||
| + | | ||
| + | var totalRows int | ||
| + | for range files { | ||
| + | numRows := <- rowChannel | ||
| + | totalRows += numRows | ||
| + | } | ||
| + | | ||
| + | return totalRows | ||
| + | } | ||
| + | </ | ||
| ===== Punteros ===== | ===== Punteros ===== | ||
| Línea 2361: | Línea 2433: | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| Línea 2367: | Línea 2442: | ||
| * https:// | * https:// | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[http:// | ||
| + | * [[https:// | ||
informatica/programacion/go.1630396433.txt.gz · Última modificación: por tempwin
