Lecciones del módulo (2/5)
Valor cero y conversiones de tipo
En Go cada variable declarada sin un valor explícito recibe un
valor cero: el "valor neutral" de su tipo. es una gran diferencia
de JavaScript, donde let x; produce undefined, o C, donde termina
Hasta con la memoria basura. Sin undefined, sin UB: solo cero.
La tabla de valor cero
| Categoría | Tipo | Valor cero |
|---|---|---|
| Numérico | CÓDIGOPH0, CÓDIGOF1, CÓDIGOF2, CÓDIGOF3, CÓDIGOF4, ... | CÓDIGOPH5 |
| Booleano | CÓDIGOPH6 | CÓDIGOPH7 |
| Cadena | CÓDIGOPH8 | "" (cadena vacía) |
| Puntero | CÓDIGOPH10 | CÓDIGOPH11 |
| Sector / Mapa / Canal | CÓDIGOPH12, CÓDIGOPH13, CÓDIGOPH14 | CÓDIGOPH15 |
| Función / Interfaz | CÓDIGOPH16, CÓDIGOPH17 | CÓDIGOPH18 |
| Estructura | CÓDIGOPH19 | todos los campos en su valor cero |
var i int // 0
var f float64 // 0
var s string // ""
var b bool // false
var p *int // nil
var nums []int // nil (NB: una slice nil ha len 0 e si può iterare!)Las conversiones son SIEMPRE explícitas
A diferencia de C, Python o JS, Go no promociona automáticamente uno
tipo numérico a otro: debes escribir type(value).
i := 42
var f float64 = float64(i)
var u uint = uint(i)Esto es cierto incluso para tipos "compatibles" como int y int64:
Siempre se requiere una conversión explícita.
var a int = 10
var b int64 = int64(a) // obbligatorioConversión entre números: cuidado con el truncamiento
Pasar de float64 a int se trunca hacia cero, no
redondo:
f := 3.9
i := int(f) // 3, non 4
n := int(-3.9) // -3, non -4Cadena ↔ conversión de números
string(65) NO da "65": da "A" (la runa con código
punto 65). Para cadena → número y viceversa necesitas el strconv
paquete:
import "strconv"
s := strconv.Itoa(42) // "42"
n, err := strconv.Atoi("42") // 42, nilLo cubriremos en profundidad en el módulo Stdlib.
Tu turno
Declare un contador variable de tipo int sin inicializarlo e imprímalo. Esperado: 0.
Mostrar pista
Sin un inicializador, la variable toma el valor cero del tipo.
Solución disponible después de 3 intentos
Dado el número entero n = 10, convierta n a float64 y divídalo por 4. Imprima el resultado (esperado 2,5).
Mostrar pista
Sin la conversión explícita, `n / 4` es una división entera que da 2.
Solución disponible después de 3 intentos
¿Qué imprime este código?
f := 3.7
fmt.Println(int(f))Resumen
- Cada tipo tiene un valor cero consistente: ni
undefined, ni UB. - Slice/map/chan/func/interface/pointer tiene valor cero
nil. - Las conversiones numéricas siempre son explícitas con
type(value). int(float)se trunca hacia cero; para redondear utilicemath.Round.- Para cadena ↔ número use el paquete
strconv(NO una conversión directa).