Cristhian Villegas
Backend9 min read2 views

Curso Go #2: Variables, Tipos de Datos y Constantes en Go

Curso Go #2: Variables, Tipos de Datos y Constantes en Go

Introduccion: Variables y Tipos en Go - Parte 2 de 10

Logo de Go

Bienvenido a la Parte 2 de 10 del Curso de Go desde Cero. En el articulo anterior instalamos Go y escribimos nuestro primer programa Hola Mundo. Ahora vamos a aprender los conceptos fundamentales que usaras en absolutamente todos los programas que escribas: variables, tipos de datos y constantes.

Go es un lenguaje de tipado estatico, lo que significa que cada variable tiene un tipo definido en tiempo de compilacion. Esto puede parecer restrictivo al principio si vienes de lenguajes como Python o JavaScript, pero es una ventaja enorme: el compilador atrapa errores antes de que tu programa se ejecute.

Nota: Este articulo es la Parte 2 de 10 del curso. Si no has leido la Parte 1 (instalacion y Hola Mundo), te recomendamos empezar por ahi.

Tipos de datos basicos en Go

Go tiene un conjunto de tipos primitivos bien definidos. Estos son los que usaras con mas frecuencia:

Tipos numericos enteros

TipoTamanoRango
int32 o 64 bits (depende de la plataforma)Numero entero con signo
int88 bits-128 a 127
int1616 bits-32768 a 32767
int3232 bits-2 mil millones a 2 mil millones
int6464 bitsRango muy amplio
uint32 o 64 bitsSolo numeros positivos

Tipos numericos decimales

TipoPrecision
float32Precision simple (7 digitos)
float64Precision doble (15 digitos) - el mas usado

Otros tipos fundamentales

  • string: Cadena de texto (inmutable en Go)
  • bool: Valor booleano (true o false)
  • byte: Alias de uint8, usado para datos binarios
  • rune: Alias de int32, representa un caracter Unicode
go
1package main
2
3import "fmt"
4
5func main() {
6    var entero int = 42
7    var decimal float64 = 3.14159
8    var texto string = "Hola Go"
9    var activo bool = true
10    var letra byte = 'A'
11    var emoji rune = '🚀'
12
13    fmt.Println(entero, decimal, texto, activo, letra, string(emoji))
14}
Recomendacion: En la mayoria de los casos, usa int para enteros y float64 para decimales. Solo usa tipos con tamano especifico (int32, int64) cuando necesites control preciso sobre la memoria o estes trabajando con APIs que lo requieran.

Declaracion de variables: var y :=

Go ofrece varias formas de declarar variables. Veamos cada una:

Declaracion con var (forma larga)

go
1package main
2
3import "fmt"
4
5func main() {
6    // Declaracion con tipo explicito y valor
7    var nombre string = "Carlos"
8    var edad int = 30
9
10    // Declaracion con tipo pero sin valor (usa el valor cero)
11    var salario float64
12    var casado bool
13
14    // Declaracion multiple en un bloque
15    var (
16        ciudad  string = "Ciudad de Mexico"
17        pais    string = "Mexico"
18        codigo  int    = 52
19    )
20
21    fmt.Println(nombre, edad)
22    fmt.Println("Salario:", salario, "Casado:", casado)
23    fmt.Println(ciudad, pais, codigo)
24}

Declaracion corta con := (la mas usada)

Dentro de funciones, puedes usar el operador := para declarar e inicializar variables de forma concisa. Go infiere el tipo automaticamente:

go
1package main
2
3import "fmt"
4
5func main() {
6    nombre := "Ana"          // Go infiere: string
7    edad := 25               // Go infiere: int
8    peso := 65.5             // Go infiere: float64
9    esEstudiante := true     // Go infiere: bool
10
11    fmt.Printf("Nombre: %s, Edad: %d, Peso: %.1f, Estudiante: %t\n",
12        nombre, edad, peso, esEstudiante)
13}
Atencion: El operador := solo funciona dentro de funciones. No puedes usarlo a nivel de paquete (fuera de funciones). Para variables a nivel de paquete, debes usar var.

Declaracion multiple en una linea

go
1package main
2
3import "fmt"
4
5func main() {
6    // Multiples variables del mismo tipo
7    var a, b, c int = 1, 2, 3
8
9    // Multiples variables con :=
10    x, y, z := "hola", 42, true
11
12    fmt.Println(a, b, c)
13    fmt.Println(x, y, z)
14}

Valores cero (zero values)

En Go, toda variable declarada sin un valor inicial recibe automaticamente un valor cero segun su tipo. Esto es diferente a otros lenguajes donde las variables no inicializadas contienen basura de memoria o lanzan errores.

Gopher de Go

TipoValor cero
int, float640
string"" (cadena vacia)
boolfalse
Punteros, slices, mapsnil
go
1package main
2
3import "fmt"
4
5func main() {
6    var entero int
7    var decimal float64
8    var texto string
9    var booleano bool
10
11    fmt.Printf("int: %d\n", entero)       // 0
12    fmt.Printf("float64: %f\n", decimal)  // 0.000000
13    fmt.Printf("string: '%s'\n", texto)   // ''
14    fmt.Printf("bool: %t\n", booleano)    // false
15}
Ventaja de seguridad: Los valores cero de Go eliminan toda una categoria de bugs que existen en lenguajes como C o C++, donde las variables no inicializadas pueden contener datos aleatorios.

Inferencia de tipos

Cuando usas := o var sin tipo explicito, Go infiere el tipo basandose en el valor asignado:

go
1package main
2
3import "fmt"
4
5func main() {
6    a := 42          // int (no int8, no int32, siempre int)
7    b := 3.14        // float64 (no float32)
8    c := "Go"        // string
9    d := true        // bool
10    e := 'A'         // rune (int32), no byte
11
12    fmt.Printf("a: %T\n", a)  // int
13    fmt.Printf("b: %T\n", b)  // float64
14    fmt.Printf("c: %T\n", c)  // string
15    fmt.Printf("d: %T\n", d)  // bool
16    fmt.Printf("e: %T\n", e)  // int32
17}

El verbo %T del paquete fmt imprime el tipo de una variable. Es muy util para depuracion.

Regla practica: Go siempre infiere int para enteros (no int32 ni int64) y float64 para decimales (no float32). Si necesitas otro tipo especifico, debes declararlo explicitamente.

Constantes con const e iota

Las constantes son valores que no cambian durante la ejecucion del programa. Se declaran con la palabra clave const:

go
1package main
2
3import "fmt"
4
5func main() {
6    const pi float64 = 3.14159265358979
7    const appName = "MiApp"
8    const maxReintentos = 3
9
10    fmt.Println("App:", appName)
11    fmt.Println("Pi:", pi)
12    fmt.Println("Max reintentos:", maxReintentos)
13
14    // Esto causaria un error de compilacion:
15    // pi = 3.14  // cannot assign to pi
16}

Constantes con iota

iota es un generador de constantes enumeradas en Go. Empieza en 0 y se incrementa automaticamente en cada linea dentro de un bloque const:

go
1package main
2
3import "fmt"
4
5// Dias de la semana como constantes enumeradas
6const (
7    Domingo = iota  // 0
8    Lunes           // 1
9    Martes          // 2
10    Miercoles       // 3
11    Jueves          // 4
12    Viernes         // 5
13    Sabado          // 6
14)
15
16// Tamanos de archivo usando iota con expresiones
17const (
18    _  = iota             // ignorar el primer valor (0)
19    KB = 1 << (10 * iota) // 1 << 10 = 1024
20    MB                    // 1 << 20 = 1048576
21    GB                    // 1 << 30 = 1073741824
22    TB                    // 1 << 40
23)
24
25func main() {
26    fmt.Println("Lunes:", Lunes)
27    fmt.Println("Viernes:", Viernes)
28    fmt.Println("1 KB =", KB, "bytes")
29    fmt.Println("1 MB =", MB, "bytes")
30    fmt.Println("1 GB =", GB, "bytes")
31}
Patron comun: iota es la forma idiomatica de Go para crear enumeraciones. Otros lenguajes tienen enum como palabra clave, pero Go usa const + iota para lograr lo mismo de forma mas flexible.

Conversion de tipos (casting)

Go es estricto con los tipos: no hay conversiones implicitas entre tipos diferentes. Debes convertir explicitamente:

go
1package main
2
3import "fmt"
4
5func main() {
6    // Conversion entre numericos
7    var entero int = 42
8    var decimal float64 = float64(entero)
9    var pequeno int32 = int32(entero)
10
11    fmt.Println(entero, decimal, pequeno)
12
13    // Conversion entre string y numeros
14    // Necesitas el paquete strconv
15    var num int = 65
16    var letra string = string(num)     // Esto da "A" (caracter ASCII), NO "65"
17    fmt.Println("string(65):", letra)  // A
18
19    // Para convertir un numero a su representacion en texto:
20    // usa fmt.Sprintf o strconv.Itoa
21    texto := fmt.Sprintf("%d", num)
22    fmt.Println("Sprintf:", texto)  // "65"
23}
Cuidado: string(65) no da "65", sino "A" (el caracter Unicode 65). Para convertir un numero a texto, usa fmt.Sprintf("%d", numero) o strconv.Itoa(numero). Este es un error muy comun en principiantes de Go.

Conversiones con strconv

go
1package main
2
3import (
4    "fmt"
5    "strconv"
6)
7
8func main() {
9    // Entero a string
10    edad := 25
11    edadTexto := strconv.Itoa(edad)
12    fmt.Println("Edad como texto:", edadTexto)
13
14    // String a entero
15    texto := "42"
16    numero, err := strconv.Atoi(texto)
17    if err != nil {
18        fmt.Println("Error:", err)
19    } else {
20        fmt.Println("Numero:", numero)
21    }
22
23    // String a float64
24    precioTexto := "19.99"
25    precio, err := strconv.ParseFloat(precioTexto, 64)
26    if err != nil {
27        fmt.Println("Error:", err)
28    } else {
29        fmt.Println("Precio:", precio)
30    }
31}

El paquete fmt: Println, Printf y Sprintf

El paquete fmt es uno de los mas usados en Go. Ya has visto Println, pero tiene funciones mucho mas poderosas:

fmt.Println: impresion simple

go
1fmt.Println("Hola", "mundo")         // Hola mundo (agrega espacio y salto de linea)
2fmt.Println("Valor:", 42, true)       // Valor: 42 true

fmt.Printf: impresion formateada

Usa verbos de formato para controlar como se muestra cada valor:

VerboDescripcionEjemplo
%dEntero decimalfmt.Printf("%d", 42) -> 42
%fPunto flotantefmt.Printf("%.2f", 3.14159) -> 3.14
%sStringfmt.Printf("%s", "Go") -> Go
%tBooleanofmt.Printf("%t", true) -> true
%TTipo de la variablefmt.Printf("%T", 42) -> int
%vValor por defectofmt.Printf("%v", algo)
%+vValor con nombres de campoUtil para structs
go
1package main
2
3import "fmt"
4
5func main() {
6    nombre := "Go"
7    version := 1.23
8    anio := 2009
9    esGenial := true
10
11    fmt.Printf("Lenguaje: %s\n", nombre)
12    fmt.Printf("Version: %.2f\n", version)
13    fmt.Printf("Creado en: %d\n", anio)
14    fmt.Printf("Es genial: %t\n", esGenial)
15    fmt.Printf("Tipo de version: %T\n", version)
16
17    // Sprintf retorna un string en lugar de imprimir
18    resumen := fmt.Sprintf("%s fue creado en %d", nombre, anio)
19    fmt.Println(resumen)
20}
Printf vs Println: Usa Println para impresiones rapidas y Printf cuando necesites control sobre el formato. Sprintf es igual que Printf pero retorna el string en lugar de imprimirlo.

Ejercicios practicos

Pon en practica lo aprendido con estos ejercicios. Intenta resolverlos antes de ver la solucion:

Ejercicio 1: Ficha personal

Crea un programa que declare variables para tu nombre, edad, altura, ciudad y si eres estudiante. Imprime todo con formato usando Printf.

go
1package main
2
3import "fmt"
4
5func main() {
6    nombre := "Ana Garcia"
7    edad := 28
8    altura := 1.65
9    ciudad := "Guadalajara"
10    esEstudiante := false
11
12    fmt.Printf("=== Ficha Personal ===\n")
13    fmt.Printf("Nombre:      %s\n", nombre)
14    fmt.Printf("Edad:        %d anios\n", edad)
15    fmt.Printf("Altura:      %.2f m\n", altura)
16    fmt.Printf("Ciudad:      %s\n", ciudad)
17    fmt.Printf("Estudiante:  %t\n", esEstudiante)
18}

Ejercicio 2: Calculadora de area

Calcula el area de un circulo dado su radio, usando una constante para Pi:

go
1package main
2
3import "fmt"
4
5func main() {
6    const pi = 3.14159265358979
7    radio := 5.0
8
9    area := pi * radio * radio
10    perimetro := 2 * pi * radio
11
12    fmt.Printf("Radio: %.1f\n", radio)
13    fmt.Printf("Area: %.2f\n", area)
14    fmt.Printf("Perimetro: %.2f\n", perimetro)
15}

Ejercicio 3: Conversion de temperatura

Convierte una temperatura de Celsius a Fahrenheit y Kelvin:

go
1package main
2
3import "fmt"
4
5func main() {
6    celsius := 37.0
7    fahrenheit := (celsius * 9.0 / 5.0) + 32.0
8    kelvin := celsius + 273.15
9
10    fmt.Printf("%.1f C = %.1f F = %.2f K\n", celsius, fahrenheit, kelvin)
11}

Ya dominas los tipos de datos, las variables y las constantes en Go. Estos son los bloques de construccion que usaras en cada programa que escribas. En el proximo articulo (Parte 3 de 10) aprenderemos sobre estructuras de control: sentencias if, switch y bucles for, que te permitiran darle logica y repeticion a tus programas.

Share:
CV

Cristhian Villegas

Software Engineer specializing in Java, Spring Boot, Angular & AWS. Building scalable distributed systems with clean architecture.

Comments

Sign in to leave a comment

No comments yet. Be the first!

Related Articles