Impresión resultado en la consola en Go
En este artículo vamos a dar una explicación en sobre como podemos imprimir resultados en la pantalla o consola atráves de la función print
en Go. Al igual que en Unix y C, Go también proporciona una variedad de formas de imprimir resultados en pantalla o consola.
Todas estas funcionalidades se utiliza el paquete fmt
en Go. El paquete fmt
en Go implementa funciones de E/S que son comparables a las funciones printf
y scanf
en C.
La sintaxis es un copia de C, pero la implementación es más sencilla en Go. Para saber mas sobre el paquete fmt en Go, lea este artículo. La forma más sencilla de iniciar con el paquete fmt
en Go, es através de las funciones println
y printf
.
Ejemplo de la función Println
package main
import "fmt"
func main() {
fmt.Println("Go dev tips es increíble!")
}
Ejemplo de la función Printf
import "fmt"
func main() {
valorString := "Go dev tips!"
fmt.Printf("Hola %s", valorString)
}
La función print
utiliza formatos predeterminados para cada valor en el orden especificado. En caso de que ocurriera algún error con el formato provisto, el error encontrado será imprimida en la pantalla.
La función fmt.Print()
es idéntica a fmt.Println()
, pero hay dos diferencias:
- No se agregará nueva línea al final de cada línea
- Espacio entre los argumentos solo se agregará si ninguno de los argumentos es del tipo String.
Signature del función:
fmt.Println(a ...interface{}) (n int, err error)
import "fmt"
func main() {
fmt.Print("Go dev tips ","es ","increíble")
// output -> Go dev tips es increíble
}
En caso de que todos los caracteres no son del tipo string, se agregarán espacios entre cada uno automáticamente:
La función fmt.Print()
también puede ser utilizado en lugar de fmt.println()
. La diferencia principal entre fmt.Print()
y fmt.Println()
es que cuando se utiliza la función fmt.Println()
se agregará un carácter de nueva línea cada vez que la use, y en cambio la función fmt.Print()
no.
Importante: Si solo tiene que imprimir una sola variable y necesita que elegir entre fmt.println()
y fmt.print()
depende si necesita el carácter de nueva línea o no.
Printf
La función fmt.printf()
necesita especificador de formatos y para cada uno, debe agregar el valor que debe corresponder al tipo de datos del especificador de formato. Con tal función tienes un mejor control, pero por otro lado exige más códigos.
package main
import "fmt"
func main() {
valorBinario := 0100
fmt.Printf("Formato binario: %b", valorBinario)
// resultado: Formato binario: 1000000
}
Especificador de formato
La siguiente tabla ilustra las posibilidades del especificador de formato:
Especificador de formato | Definición |
%b | – Sistema numérico binario (base 2) – Cuando se trata de componentes de coma flotante (floating-point) y complejos. Sera un notación científica sin decimal con una potencia de dos. Por ejemplo: -123456 -78 |
%c | Carácter de Unicode. Para ejemplos consulte Unicode genérico en Go |
%d | Entero basado al sistema numérico base 10 (int , int8 , int16 , int32 , int64 , uint , uint8 , uint16 , uint32 , uint64 and uintptr )– Int : 32 bits signado entero– Int8 : 8 bits signado (rango: -128 -> 127)– Int16 : 16-bit signado (rango: -32768 -> 32767)– Int32 : 32-bit entero (rango: -2147483648 -> 2147483647)– Int64 : 64-bit entero (rango: -9223372036854775808 -> 9223372036854775807)– Uint : 32 bits entero no signado– Uint8 : 8 bits entero no signado (rango: 0 -> 255)– Uint16 : 16 bits entero no signado (rango: 0 -> 65535)– Uint32 : 32 bits entero no signado (rango: 0 -> 4294967295)– Uint64 : 64 bits entero no signado (rango: 0 -> 18446744073709551615)– Uintptr : 64 bits entero no signado. |
%o | Entero basado en la sistema de numeración base 8 conocido como Octal: rango 0 – 7. |
%O | Entero basado al sistema numérico base 8 con prefijo ‘0o’. |
%q | Escape de comillas simples |
%x | Sistema numeración base 16 minúsculas (hexadecimal). Leer artículo Imprimir hexadecimal en Go para más información. |
%X | Sistema numeración base 16 mayúsculas (hexadecimal). Leer artículo Imprimir hexadecimal en Go para más información. |
%U | Unicode. Leer artículo Imprimir hexadecimal en Go para más información. |
%e | Exponente de notación científica, por ejemplo: -1.234456e+78 |
%E | Exponente de notación científica, por ejemplo: -1.234456E+78 |
%f, %F | Decimal sin exponente (floating-point). Precisión: – %f : anchura predeterminado (estándar)– %9f : anchura de 9 carácter (precisión estándar)– %.2f : anchura predeterminado (con precisión de 2 decimal)– %9.2f : anchura de 9 carácter (con precisión de 2 decimal)– %9.f : anchura de 9 carácter (con precisión de 0 decimal) |
%g | La misma que %e pero para grandes exponentes |
%G | La misma que %E pero para grandes exponentes |
%x | En caso de punto flotante: – Notación hexadecimal (potencias exponentes de dos decimales). Por ejemplo: 0x1.3ep+42 En caso de rodajas ‘slice’ o string: – Sistema numeración base 16 minúsculas (dos caracteres por byte) |
%X | En caso de punto flotante: – Notación hexadecimal (potencias exponentes de dos decimales). Por ejemplo: 0x1.3EP+42 En caso de rodajas ‘slice’ o string: – Sistema de numeración base 16 minúsculas (dos caracteres por byte) |
%s | Bytes de rodajas de string ‘cadena’ |
%q | Formato de escape de cadena entre comillas dobles |
%p | Primer elemento en la anotación de Sistema de numeración base 16 con el prefijo ‘0x’. Importante: %b ,%d ,%o , %x y %X también puede ser utilizado. El valor sera exactamente cómo un número entero. |
%t | Boolean |
%v | Variable en un formato predeterminado que se puede utilizar con: – %t – %d (‘%#x ‘ si imprime con ‘%#v ‘)– %g – %s – %p |
\b | Retroceso (U0008 ) |
\\ | Barra invertida (U005c ) |
\t | Pestaña horizontal (U0009 ) |
\n | Nueva línea (U000A ) |
\f | Formulario alimentación (U000C ) |
\r | Retorno de carro (U000D ) |
\v | Pestaña vertical (U000b ) |
Ejemplos de especificador de formato avanzado
Especificador de formato | Descripción | Ejemplo |
%+d | Mostrar el signo más | ‘+105’ |
%<anchura>d | Almohadilla con espacios (anchura total con relleno en el lado izquierdo en caso de que el valor sea menor que la anchura especificado) | %5d -> __105 |
%-<anchura>d | Almohadilla con espacios ( anchura total con relleno en el lado derecho en caso de que el valor sea menor que la anchura especificado) | %-5d -> 105__ |
%0<anchura>d | Almohadilla con ceros basado en la anchura proporcionado | %05d -> 00105 |
%#x | Sistema de numeración base 16 con 0x como inicial | 105 -> 0x69 |
%#U | Unicode con carácter | 105 -> U+0069 ‘i’ |
%<anchura>s | Anchura total con relleno en el lado izquierdo en caso de que el valor sea menor que el ancho especificado. | %8s -> “___value” |
%-<anchura>s | Anchura total con relleno en el lado derecho en caso de que el valor sea menor que el ancho especificado | %-8s -> “value___” |
Manejar errores del función printf
Argumento inválido
Cuando utiliza la función printf
con especificador de formatos, arroja un error cuando se proporciona un argumento inválido. Un ejemplo de tal escenario es proporcionar una número entero en lugar de un cadena.
Todos los errores inician con la cadena «%!» y a veces por un solo carácter y terminan con una descripción entre paréntesis. En este ejemplo, esperaba una cadena, pero encontró un entero del valor 24.
Error de argumentos faltantes
Cuando se proporciona un especificador de formato y no se proporciona ningún argumento, se produce un error faltante.
Error de demasiados argumentos
Este error se produce cuando se proporcionan más argumentos que los especificador de formato esperaba.
En este ejemplo, el mensaje de error le indica que proporciona un argumento adicional «Dev» de tipo String (cadena) y «Tips» de tipo String (cadena).
Error de anchura invalido
Con un especificador de formato, también puede definir un anchura personalizado para la cadena correspondiente utilizando «%*s
«. Una anchura personalizada espera un valor del tipo entero y si define un valor que no es del tipo entero, arrojará un error BADWIDTH.
Error de precisión invalido
Con un especificador de formato, también puede definir una precisión personalizada para la cadena correspondiente con el uso de ‘%.*s
’. Una precisión personalizada espera un valor entero y si define un valor que no sea del tipo entero, arrojará un error BADPREC.
Error de índice inválido
La definición de índice de argumento también está permitida cuando utiliza la función printf
usando el ‘%*[índice]d
’. Este especificador de formato define una matriz de enteros y el índice en el que se debe recuperar el valor.
Cuando se proporciona un índice de argumento inválido, se generará un error BADINDEX.
Error pánico
Algunas de las funciones pueden generar error pánico cuando algo fatal se occure, por ejemplo, cuando el valor proporcionado es igual a nil. En caso de valores cadena, consigue el siguiente mensaje de error: “<nil>”.
Println
La función println
imprime datos en la consola. Al usar esta función, se agregará una nueva línea al final de cada línea.
fmt.Println(...interface{}) (n int, err error)
Según la signatura de la función, contiene la interfaz, lo que significa que acepta varios argumentos de cualquier tipo.
package main
import "fmt"
func main() {
fmt.Println("Go dev tips es increíble!")
}
El ‘Comando vet’ para encontrar códigos sospechosos o errores en sintaxis
El comando vet
examina el código fuente de Go y informa sobre construcciones sospechosas o posibles errores. Con todos los ejemplos de error proporcionados anteriormente en la sección anterior con este comando, puede capturar el error que quizás el compilador no haya detectado.
Este comando puede ser utilizado en la siguiente forma:
go vet <archivo de proyecto>
En el siguiente ejemplo, vamos a comprobar si hay algún error en el archive Go print_f.go
. El resultado indica que en la línea 13 hay una función Sprintf
con dos argumentos en lugar de uno:
Síguenos: