← Volver al listado de tecnologías

Variables y Tipos de Datos

Por: Artiko
govariablestiposconstantes

Variables y Tipos de Datos

Declaracion de variables

Go ofrece dos formas de declarar variables:

Con var (explicita)

package main

import "fmt"

func main() {
	// Tipo explicito
	var nombre string = "Artiko"
	var edad int = 30

	// Tipo inferido
	var lenguaje = "Go"

	// Declaracion sin valor (usa zero value)
	var activo bool

	fmt.Println(nombre, edad, lenguaje, activo)
	// Artiko 30 Go false
}

Con := (short declaration)

package main

import "fmt"

func main() {
	// Solo funciona dentro de funciones
	nombre := "Artiko"
	edad := 30
	pi := 3.14159

	fmt.Println(nombre, edad, pi)
}

La diferencia clave: var puede usarse a nivel de paquete, := solo dentro de funciones.

Declaracion multiple

package main

import "fmt"

func main() {
	// Bloque var
	var (
		host   = "localhost"
		puerto = 8080
		debug  = false
	)

	// Short declaration multiple
	x, y, z := 1, 2, 3

	fmt.Println(host, puerto, debug, x, y, z)
}

Tipos basicos

Tabla de tipos

TipoZero valueDescripcion
boolfalseBooleano
int0Entero (32 o 64 bits segun plataforma)
int80Entero con signo de 8 bits (-128 a 127)
int160Entero con signo de 16 bits
int320Entero con signo de 32 bits (alias: rune)
int640Entero con signo de 64 bits
uint0Entero sin signo (32 o 64 bits)
uint80Entero sin signo de 8 bits (alias: byte)
uint160Entero sin signo de 16 bits
uint320Entero sin signo de 32 bits
uint640Entero sin signo de 64 bits
float320.0Punto flotante 32 bits (IEEE 754)
float640.0Punto flotante 64 bits (IEEE 754)
complex64(0+0i)Numero complejo con float32
complex128(0+0i)Numero complejo con float64
string""Cadena de texto (inmutable, UTF-8)
byte0Alias de uint8
rune0Alias de int32 (punto de codigo Unicode)

Zero values

En Go toda variable tiene un valor por defecto (zero value). No existen variables sin inicializar:

package main

import "fmt"

func main() {
	var entero int
	var flotante float64
	var booleano bool
	var cadena string
	var puntero *int

	fmt.Println(entero)   // 0
	fmt.Println(flotante) // 0
	fmt.Println(booleano) // false
	fmt.Println(cadena)   // "" (string vacio)
	fmt.Println(puntero)  // <nil>
}

Esto elimina errores por variables no inicializadas que existen en C o C++.

Constantes

Las constantes se declaran con const y deben tener valor en tiempo de compilacion:

package main

import "fmt"

const Pi = 3.14159
const Version = "1.0.0"

// Bloque de constantes
const (
	KB = 1024
	MB = KB * 1024
	GB = MB * 1024
)

func main() {
	fmt.Println("Pi:", Pi)
	fmt.Println("1 GB =", GB, "bytes")
}

iota: generador de constantes

iota es un identificador que se incrementa automaticamente en bloques const:

package main

import "fmt"

// Enum con iota
type DiaSemana int

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

// Bitmask con iota
const (
	Lectura   = 1 << iota // 1
	Escritura             // 2
	Ejecucion             // 4
)

func main() {
	fmt.Println("Miercoles =", Miercoles) // 2
	fmt.Println("Lectura =", Lectura)     // 1
	fmt.Println("Escritura =", Escritura) // 2
	fmt.Println("Ejecucion =", Ejecucion) // 4

	// Combinar permisos con OR
	permisos := Lectura | Escritura
	fmt.Println("Permisos:", permisos) // 3
}

Conversiones de tipo

Go no tiene conversiones implicitas. Toda conversion debe ser explicita:

package main

import "fmt"

func main() {
	// int a float
	entero := 42
	flotante := float64(entero)

	// float a int (trunca, no redondea)
	pi := 3.99
	truncado := int(pi) // 3

	// int entre distintos tamanios
	var grande int64 = 1000
	var chico int32 = int32(grande)

	// string a []byte y viceversa
	texto := "Hola"
	bytes := []byte(texto)
	deVuelta := string(bytes)

	fmt.Println(flotante, truncado, chico, deVuelta, bytes)
	// 42 3 1000 Hola [72 111 108 97]
}

Intentar mezclar tipos sin conversion genera error:

// ESTO NO COMPILA
var a int32 = 10
var b int64 = 20
// c := a + b  // error: mismatched types int32 and int64

// Solucion: convertir explicitamente
c := int64(a) + b

Type alias vs Type definition

package main

import "fmt"

// Type definition: crea un tipo NUEVO
type Celsius float64
type Fahrenheit float64

// Type alias: solo un nombre alternativo (mismo tipo)
type Entero = int

func main() {
	var temp Celsius = 100.0
	// var f Fahrenheit = temp // ERROR: tipos incompatibles

	// Conversion explicita necesaria
	var f Fahrenheit = Fahrenheit(temp*9/5 + 32)

	// Type alias es intercambiable
	var n Entero = 42
	var m int = n // OK: mismo tipo subyacente

	fmt.Println(temp, "C =", f, "F")
	fmt.Println("n:", n, "m:", m)
}

fmt.Printf y verbos de formato

fmt.Printf permite formateo preciso con verbos:

VerboDescripcionEjemplo
%vValor por defectofmt.Printf("%v", 42)42
%+vValor con nombres de campo (structs){Nombre:Go}
%#vRepresentacion Go del valormain.Config{...}
%TTipo de la variablefmt.Printf("%T", 42)int
%dEntero decimalfmt.Printf("%d", 42)42
%bEntero binariofmt.Printf("%b", 10)1010
%oEntero octalfmt.Printf("%o", 8)10
%xEntero hexadecimalfmt.Printf("%x", 255)ff
%fFloat decimalfmt.Printf("%f", 3.14)3.140000
%.2fFloat con 2 decimalesfmt.Printf("%.2f", 3.14)3.14
%sStringfmt.Printf("%s", "hola")hola
%qString con comillasfmt.Printf("%q", "hola")"hola"
%pPunterofmt.Printf("%p", &x)0xc0000...
%tBooleanofmt.Printf("%t", true)true
package main

import "fmt"

func main() {
	nombre := "Go"
	version := 1.22
	anio := 2024
	activo := true

	fmt.Printf("Lenguaje: %s v%.2f (%d)\n", nombre, version, anio)
	fmt.Printf("Activo: %t\n", activo)
	fmt.Printf("Tipo de version: %T\n", version)
	fmt.Printf("Anio en hex: %x\n", anio)
	// Lenguaje: Go v1.22 (2024)
	// Activo: true
	// Tipo de version: float64
	// Anio en hex: 7e8
}

Ejercicios

  1. Declara variables de cada tipo basico e imprime sus zero values
  2. Crea un enum de colores usando iota y una funcion que retorne el nombre como string
  3. Implementa una funcion que convierta Celsius a Fahrenheit usando type definition

Resumen