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 10:20] – [Punteros] 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 2266: | Línea 2267: | ||
| </ | </ | ||
| - | ===== Goroutines ===== | + | ===== Goroutines |
| - | Las rutinas de Go son como los hilos. Los canales se comunican entre las rutinas de go. | + | Mucha de la programación que se hace es secuencial. |
| + | 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 2395: | Línea 2433: | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| Línea 2401: | Línea 2442: | ||
| * https:// | * https:// | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[http:// | ||
| + | * [[https:// | ||
informatica/programacion/go.1630398043.txt.gz · Última modificación: por tempwin
