Ya te habrá pasado más de una vez: te has puesto a hacer alguno de los ejemplos o ejercicios de este libro y te ha pasado algo como esto.
gore> cosa
# command-line-arguments
/tmp/618020410/gore_session.go:10: undefined: cosa
error: exit status 2
exit status 2
No te preocupes. Todos nos equivocamos. Y los ordenadores, en general, no lo hacen.
En este caso, el intérprete no es capaz de encontrar algo cuyo nombre sea "cosa". Como consecuencia de ello, lanza un mensaje mostrando su disconformidad y dice que es un error. Los lenguajes de programación no tienen, todavía, la habilidad de decir las cosas con tacto y la palabra "error" nos puede sonar un poco fuerte.
"No te entiendo" sería una mejor forma de mostrar esta disconformidad. Los compiladores, intérpretes y, en general, lo relacionado con la computación suele ser muy literales. Esperan una cosa y encuentran otra que, para ellos, es otra totalmente distinta. Un ejemplo:
gore> 1 + "1"
# command-line-arguments
/tmp/517555771/gore_session.go:10:26: cannot convert "1" to type int
/tmp/517555771/gore_session.go:10:26: invalid operation: 1 + "1" (mismatched types int and string)
En principio estaríamos sumando 1+1
, pero en un caso tenemos
una cadena y en el otro un número entero. De hecho, algunos otros
lenguajes se comportarán de forma diferente. JavaScript, por ejemplo,
dirá que "3.4"+7
es, naturalmente, 3.47
haciendo una conversión
implícita de un número a una cadena. Otro lenguaje, R, te dirá:
Error in "3.4" + 7 : argumento no-numérico para operador binario
.
No le gusta la cadena y no tiene reparos en decirlo, porque R es un
lenguaje estadístico, y por tanto (casi) matemático. Perl, sin embargo,
llevará el tipado pato hasta las últimas consecuencias, dando como resultado
10.4.
Lo que viene a querer decir que lenguajes diferentes van a entender
esa expresión, forzosamente ambigua, de forma diferente. Pero si no
la entienden, te van a dar alguna pista de por qué no lo han hecho. En
el último ejemplo, la pista es (mismatched types int and string)
o
dicho de otra forma, no mezcles churras con merinas.
En todo caso, estos mensajes te ayudan a entender dónde ha producido el malentendido y de qué se trata. Aunque estén en inglés (en la mayoría de los casos), conviene leerlos tranquilamente y comprender qué es lo que dicen, porque te da la pista de por qué el ordenador no ha sido capaz de entender lo que se le quería decir. En este caso, porque Go no sabe como sumar dos cosas que tienen un tipo diferente. Simplemente, a la siguiente, se le suministran cosas a los dos lados del signo + que sean compatibles y listos: nadie ha salido herido.
Y si todo falla, siempre puedes buscarlo en Internet. Eliminando lo que sea específico de tu código, como nombres de variable y demás, puedes buscar el resto y llegará, en la mayor parte de los casos, a StackOverflow o a la propia documentación del lenguaje donde verás contextos similares y una solución al problema. En este caso, te viene a decir que hay que hacer una conversión explícita:
import strconv
i,error := strconv.Atoi("1")
1 + i
Como conclusión a esta sección: si el ordenador no te entiende y te lo dice cortésmente, lee, comprende, trata de adaptarte a lo que requiere, pero si todo falla, los buscadores son tus amigos.
No es malo equivocarse. Sucede en las mejores familias, incluso en las operaciones más básicas. Prueba y error: es la mejor forma de aprender algo nuevo como este lenguaje de programación.