Códigos de Go que debes saber para aprender correctamente

Go

package main

import (
	"fmt"
	"os"
)

func readFile(filename string) error {
	file, err := os.Open(filename)
	if err != nil {
		return err
	}
	defer file.Close() // Asegura que el archivo se cierre al final de la función

	data := make([]byte, 100)
	_, err = file.Read(data)
	if err != nil {
		return err
	}
	fmt.Println("Contenido del archivo:", string(data))
	return nil
}

func main() {
	err := readFile("ejemplo.txt")
	if err != nil {
		fmt.Println("Error al leer el archivo:", err)
	}
}

Go

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	var wg sync.WaitGroup

	for i := 0; i < 5; i++ {
		wg.Add(1)
		go func(id int) { // Goroutine anónima
			defer wg.Done()
			fmt.Printf("Goroutine %d en ejecución...\n", id)
			time.Sleep(time.Millisecond * 100 * time.Duration(id))
			fmt.Printf("Goroutine %d terminada.\n", id)
		}(i) // Pasar 'i' como argumento para evitar la captura por referencia
	}

	wg.Wait()
	fmt.Println("Todas las goroutines han terminado.")
}

Go

package main

import (
	"fmt"
	"time"
)

func main() {
	canal1 := make(chan string)
	canal2 := make(chan string)

	go func() {
		time.Sleep(time.Second * 2)
		canal1 <- "Mensaje del canal 1"
	}()

	go func() {
		time.Sleep(time.Second * 1)
		canal2 <- "Mensaje del canal 2"
	}()

	for i := 0; i < 2; i++ {
		select {
		case msg1 := <-canal1:
			fmt.Println("Recibido del canal 1:", msg1)
		case msg2 := <-canal2:
			fmt.Println("Recibido del canal 2:", msg2)
		case <-time.After(time.Millisecond * 500):
			fmt.Println("Tiempo de espera agotado en la iteración", i)
		}
	}
}

Go

package main

import "fmt"

const (
	Domingo = iota // 0
	Lunes          // 1
	Martes         // 2
	Miercoles      // 3
	Jueves         // 4
	Viernes        // 5
	Sabado         // 6
)

const (
	_  = iota // Ignorar el primer valor
	KB = 1 << (10 * iota) // 1 << 0 = 1
	MB                      // 1 << 10 = 1024
	GB                      // 1 << 20 = 1048576
)

func main() {
	fmt.Println("Domingo:", Domingo)
	fmt.Println("KB:", KB)
	fmt.Println("MB:", MB)
	fmt.Println("GB:", GB)
}

Go

package main

import (
	"context"
	"fmt"
	"time"
)

func worker(ctx context.Context, id int) {
	fmt.Printf("Trabajador %d iniciando...\n", id)
	select {
	case <-time.After(time.Second * time.Duration(id+1)):
		fmt.Printf("Trabajador %d terminado.\n", id)
	case <-ctx.Done():
		fmt.Printf("Trabajador %d cancelado.\n", id)
	}
}

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), time.Second*3)
	defer cancel()

	for i := 0; i < 5; i++ {
		go worker(ctx, i)
	}

	time.Sleep(time.Second * 5)
	fmt.Println("Programa principal terminando.")
}

Go

package main

import "fmt"

func main() {
	// Slice con longitud 0 y capacidad 10
	sliceConCapacidad := make([]int, 0, 10)
	fmt.Printf("Slice (len=%d, cap=%d): %v\n", len(sliceConCapacidad), cap(sliceConCapacidad), sliceConCapacidad)

	for i := 0; i < 10; i++ {
		sliceConCapacidad = append(sliceConCapacidad, i)
	}
	fmt.Printf("Slice después de append (len=%d, cap=%d): %v\n", len(sliceConCapacidad), cap(sliceConCapacidad), sliceConCapacidad)

	// Map con tamaño inicial estimado de 5
	mapaInicial := make(map[string]int, 5)
	mapaInicial["uno"] = 1
	mapaInicial["dos"] = 2
	fmt.Println("Mapa inicial:", mapaInicial)
}

Go

package main

import "fmt"

func imprimirCualquierCosa(val interface{}) {
	fmt.Printf("Valor: %v, Tipo: %T\n", val, val)
}

func main() {
	imprimirCualquierCosa(10)
	imprimirCualquierCosa("Hola")
	imprimirCualquierCosa(struct{ Nombre string }{Nombre: "Mundo"})
}

Go

package main

import "fmt"

func ejemploPanic() {
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("Recuperado del panic:", r)
		}
	}()

	fmt.Println("Iniciando función...")
	panic("Algo salió mal!")
	fmt.Println("Esta línea no se ejecutará.")
}

func main() {
	fmt.Println("Programa principal iniciando...")
	ejemploPanic()
	fmt.Println("Programa principal continuando después del panic.")
}
Scroll al inicio