Fundamentos de Go: Conceptos Básicos
10 ejemplos para empezar con los Fundamentos de Go: 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para empezar con los Fundamentos de Go: 7 básicos y 3 intermedios.
mkdir hello && cd hello && go mod init example.com/hello.go run . después de guardarlo como main.go en ese directorio.El ejecutable más pequeño: un paquete main con func main().
package main
import "fmt"
func main() {
fmt.Println("hola, Go")
}package main marca un ejecutable, no una biblioteca.import "fmt" trae el paquete de entrada/salida formateada de la biblioteca estándar.go run . compila y ejecuta sin dejar un binario en el directorio.Relacionado: Cómo se Estructuran los Programas Go - paquetes, enlazado y la cadena de herramientas
Declara con var o usa := dentro de funciones.
package main
import "fmt"
func main() {
var name string = "Go"
year := 2009
fmt.Println(name, year)
}:= infiere el tipo y solo puede aparecer dentro de funciones.var funciona a nivel de paquete; := no.Relacionado: Variables, Constantes y Ámbito - estilos de declaración y reglas de ámbito
Las variables obtienen un valor predeterminado sin inicialización explícita.
package main
import "fmt"
func main() {
var count int
var ready bool
var label string
fmt.Printf("int=%d bool=%t string=%q\n", count, ready, label)
}0, bool es false, las cadenas "".nil.Relacionado: Valores Cero e Inicialización - valores predeterminados por tipo y patrones de inicialización
const nombra valores en tiempo de compilación; iota construye constantes enumeradas.
package main
import "fmt"
const (
Sunday = iota
Monday
Tuesday
)
func main() {
fmt.Println(Sunday, Monday, Tuesday) // 0 1 2
}iota se reinicia a 0 en cada bloque const e incrementa por línea.Relacionado: Variables, Constantes y Ámbito - patrones de
iotay ámbito
Los strings son secuencias de bytes UTF-8; itera por rune con range.
package main
import "fmt"
func main() {
s := "café"
for i, r := range s {
fmt.Printf("%d: %U\n", i, r)
}
}range sobre un string produce el índice de byte y el rune (int32), no el desplazamiento de byte para caracteres multibyte.len(s) cuenta bytes, no runes.[]rune(s) cuando necesites acceso aleatorio por índice de carácter.Relacionado: Tipos Numéricos, Strings, Runes y Slices de Bytes - UTF-8, runes y conversiones
Los slices son vistas dinámicas sobre un array subyacente.
package main
import "fmt"
func main() {
nums := []int{1, 2, 3}
nums = append(nums, 4)
fmt.Println(nums, len(nums), cap(nums))
}append puede asignar un nuevo array subyacente cuando se excede la capacidad.len es el número de elementos; cap es el tamaño del array subyacente desde la cabecera del slice.nil es válido y funciona con append y range.Relacionado: Arrays, Slices y Maps de un Vistazo - len/cap y compartición
Los maps son tablas hash indexadas por tipos comparables.
package main
import "fmt"
func main() {
ages := map[string]int{"ada": 36}
ages["linus"] = 55
if v, ok := ages["grace"]; ok {
fmt.Println(v)
} else {
fmt.Println("grace: desconocido")
}
}v, ok := m[key] distingue las claves faltantes de los valores cero.make o un literal antes de la asignación.Relacionado: Arrays, Slices y Maps de un Vistazo - iteración de maps y errores comunes
Agrupa campos en una struct; embebe para promover métodos y campos.
package main
import "fmt"
type Person struct{ Name string }
type Employee struct {
Person
ID int
}
func main() {
e := Employee{Person: Person{Name: "Grace"}, ID: 1}
fmt.Println(e.Name, e.ID) // campo promovido
}Relacionado: Structs, Embebido y Promoción de Campos - modelado y reglas de promoción
& toma una dirección; * desreferencia. Los métodos pueden usar receptores de puntero para mutar.
package main
import "fmt"
type Counter struct{ n int }
func (c *Counter) Inc() { c.n++ }
func main() {
c := &Counter{}
c.Inc()
fmt.Println(c.n)
}nil causan pánico al desreferenciarlos; comprueba antes de usar.Relacionado: Punteros y el Operador de Dirección - cuándo los punteros ayudan vs. perjudican
Separa main del código reutilizable en diferentes paquetes dentro de un módulo.
// main.go
package main
import "example.com/hello/greet"
func main() {
greet.Hello("world")
}// greet/greet.go
package greet
import "fmt"
func Hello(name string) {
fmt.Printf("hola, %s\n", name)
}main compilan ejecutables; greet es un paquete de biblioteca.Hello); los de minúscula permanecen privados.go run . con ambos archivos en su lugar.Relacionado: Cómo se Estructuran los Programas Go - módulos, importaciones y
internal/
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado Green Tea GC, go fix modernizers - verifica el parche en la compilación), chi (última versión - verifica en la compilación), gin (última versión - verifica en la compilación), echo (última versión - verifica en la compilación), google.golang.org/grpc (última versión - verifica en la compilación), sigs.k8s.io/controller-runtime (última versión - verifica en la compilación), kubebuilder (última versión - verifica en la compilación), tinygo (última versión - verifica objetivos de placa en la compilación), wazero (última versión - verifica en la compilación) y golangci-lint (última versión - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 19 jul 2026