var x int = 10 Variable con tipo explícito
x := 10 Declaración corta de variable (inferida)
const Pi = 3.14159 Declaración de constante
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 Tipos enteros
float32 float64 Tipos de punto flotante
string bool byte rune Otros tipos básicos
if x > 0 {
...
} else if x == 0 {
...
} else {
...
} If/else (sin paréntesis necesarios)
for i := 0; i < 10; i++ { ... } Bucle for clásico
for _, v := range slice { ... } Rango sobre slice/map/string
for condition { ... } Bucle estilo while
for { ... } Bucle infinito
switch x {
case 1:
...
case 2, 3:
...
default:
...
} Switch (sin fallthrough por defecto)
fmt.Println("hello") Imprimir con salto de línea
fmt.Sprintf("name: %s, age: %d", name, age) Cadena con formato
strconv.Atoi(s) / strconv.Itoa(n) Conversión string <-> int
s := []int{1, 2, 3} Crear un slice literal
s := make([]int, 0, 10) Crear slice con longitud y capacidad
s = append(s, 4, 5) Añadir elementos al slice
s[1:3] Porción de slice (índice 1 a 2)
len(s) / cap(s) Longitud y capacidad del slice
copy(dst, src) Copiar elementos entre slices
s = append(s[:i], s[i+1:]...) Eliminar elemento en índice i
sort.Ints(s) / sort.Strings(s) Ordenar slice in situ
slices.Contains(s, val) Comprobar si el slice contiene un valor (Go 1.21+)
m := map[string]int{"a": 1} Crear un map literal
m := make(map[string]int) Crear map vacío
m["key"] = value Establecer valor del map
val, ok := m["key"] Obtener valor con comprobación de existencia
delete(m, "key") Eliminar clave del map
for k, v := range m { ... } Iterar sobre entradas del map
func add(a, b int) int {
return a + b
} Función con tipo de retorno
func divide(a, b float64) (float64, error) Múltiples valores de retorno
func greet(name string, opts ...string) Función variádica
result, err := divide(10, 3) Capturar múltiples retornos
fn := func(x int) int { return x * 2 } Función anónima / cierre
defer file.Close() Diferir ejecución hasta que la función retorne
func init() { ... } Función de inicialización del paquete
type User struct {
Name string
Age int
} Definición de tipo struct
u := User{Name: "Alice", Age: 30} Struct literal
u := &User{Name: "Alice"} Puntero a struct
func (u User) Greet() string {
return "Hi " + u.Name
} Método en struct (receptor por valor)
func (u *User) SetName(n string) {
u.Name = n
} Método con receptor puntero (mutar)
type Admin struct {
User
Role string
} Incrustación de struct (composición)
type Config struct {
Host string `json:"host"`
} Etiquetas de struct (JSON, DB, etc.)
type Reader interface {
Read(p []byte) (n int, err error)
} Definición de interfaz
type Stringer interface {
String() string
} Interfaz Stringer (como toString)
interface{} / any Interfaz vacía (acepta cualquier tipo)
val, ok := i.(ConcreteType) Aserción de tipo con comprobación
switch v := i.(type) {
case string:
...
case int:
...
} Switch de tipo
go func() { ... }() Lanzar goroutine
ch := make(chan int) Crear canal sin búfer
ch := make(chan int, 10) Crear canal con búfer (capacidad 10)
ch <- value Enviar valor al canal
value := <-ch Recibir valor del canal
close(ch) Cerrar canal (no más envíos)
select {
case v := <-ch1:
...
case ch2 <- val:
...
default:
...
} Select en múltiples canales
var mu sync.Mutex
mu.Lock()
defer mu.Unlock() Mutex para estado compartido
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
...
}()
wg.Wait() WaitGroup para coordinar goroutines
if err != nil {
return fmt.Errorf("failed: %w", err)
} Envolver y propagar error
errors.New("something failed") Crear error simple
fmt.Errorf("user %d: %w", id, err) Crear error con formato (envolviendo)
errors.Is(err, target) Comprobar si el error coincide con el objetivo
errors.As(err, &target) Extraer error tipado de la cadena
type MyError struct {
Code int
Msg string
}
func (e *MyError) Error() string {
return e.Msg
} Tipo de error personalizado
panic("fatal") / recover() Panic y recover (raro, evitar)
Cheat Sheet de Go (Golang) — Goroutines, Channels, Interfaces y Manejo de Errores
Go apareció en 2009 con la intención de mantenerse pequeño: lista corta de palabras clave, estilo impuesto por gofmt y concurrencia con goroutines y canales. La chuleta de abajo cubre 60+ fragmentos en básicos, slices y maps, funciones, structs, interfaces, concurrencia y manejo de errores. La mayoría de los líos en código Go no vienen de olvidar sintaxis. Vienen de rarezas que parecen normales hasta que muerden. Un valor de interfaz que guarda un puntero tipado nil no es nil en sí mismo, así que `if err != nil` da true sobre un `err` al que se asignó `var p *MyError; return p` — la interfaz sigue cargando el tipo. Una slice y su `append` pueden compartir o no el array subyacente según la capacidad, así que hacer append sobre una slice recibida puede mutar los datos del llamante o dejar de reflejarlos en silencio. El orden de iteración de los maps se randomiza adrede entre ejecuciones, así que un test dependiente del orden pasa nueve veces y falla a la décima. Estos son los fragmentos consultados al depurar eso: el chequeo de nil, el patrón de append, la dirección del canal.
Trampas habituales en Go
Hay un puñado de patrones que merecen sitio cerca de la cabecera de cualquier archivo Go. Conviene devolver `nil` literal cuando no hay error en vez de un nil tipado envuelto en una interfaz, porque `return (*MyError)(nil)` contra un tipo de retorno `error` produce una interfaz no-nil que se salta los chequeos `if err != nil` aguas abajo. Conviene envolver los errores propagados con `fmt.Errorf("contexto: %w", err)` para que los llamantes puedan usar después `errors.Is` y `errors.As` — un `%v` a secas pierde esa información. `defer` evalúa sus argumentos en el punto donde se ejecuta la sentencia, no cuando la llamada diferida se dispara, así que `defer log.Print(time.Now())` registra el instante de inicio y no el de fin. El bucle `for _, v := range slice` reutiliza la misma variable `v` entre iteraciones, inofensivo hasta que una goroutine la captura por referencia (Go 1.22 hizo que cada iteración tenga su propio ámbito, pero el código pre-1.22 todavía en producción necesita el sombreado explícito `v := v`). La chuleta agrupa todo esto en Básicos, Slices y Maps, Funciones, Structs, Interfaces, Concurrencia y Manejo de Errores para que la sección adecuada esté a un clic.
- Más de 60 fragmentos prácticos de Go
- 7 categorías desde básicos hasta concurrencia
- Goroutines y canales explicados
- Patrones de manejo de errores
- Copia al portapapeles con un clic
- Métodos de struct e interfaces cubiertos
Gratis. Sin registro. Tus datos permanecen en tu navegador. Anuncios mediante Google AdSense (con consentimiento).
Por Marco B. ·