Requisito previo: Paquetes en GoLang e Importación en GoLang
Definiendo técnicamente, un paquete es esencialmente un contenedor de código fuente para algún propósito específico. Los paquetes son muy esenciales ya que en todos los programas se utilizan desde los programas más básicos hasta códigos complejos de alto nivel. Un paquete garantiza que no se repita ningún código y que el código principal sea lo más conciso posible de una manera bien estructurada. Go proporciona varios paquetes integrados a los usuarios para que puedan codificar fácilmente con paquetes de funcionalidad básica predefinidos. Uno de esos paquetes en el paquete » fmt «. fmt significa el paquete de formato. Este paquete permite formatear strings básicas, valores o cualquier cosa e imprimirlos o recopilar la entrada del usuario desde la consola, o escribir en un archivo usando un escritor o incluso imprimir mensajes de error personalizados. Este paquete tiene que ver con el formato de entrada y salida.
Independientemente del sistema que haya instalado Vaya, busque su $GOPATH y luego visite “$GOPATH/src/fmt/” en su sistema. Encontrará los siguientes archivos de paquete en este directorio en particular. Bueno, podemos decir que todos estos archivos pertenecen al paquete fmt.
Veamos las funciones que proporciona a sus usuarios junto con una breve descripción de cada función:
FUNCIONES |
DESCRIPCIÓN |
---|---|
Print simplemente imprime cualquier entrada que recibe tal como está en la pantalla de la consola de salida, comenzando desde la posición actual del cursor sin agregar ningún espacio o nueva línea a menos que esté codificado explícitamente. Además de imprimir, devuelve dos valores: el número de bytes escritos y el mensaje de error en caso de que se escriba se encuentra un error. |
|
Printf formatea la string de entrada a elección del usuario y luego imprime la string formateada en la consola de salida comenzando desde la posición actual del cursor sin agregar ningún espacio o línea nueva, a menos que se codifique explícitamente. Además de imprimir, devuelve dos valores: el número de bytes escritos y un mensaje de error en caso de que se produzca algún error. |
|
Println funciona igual que la función de impresión, excepto que agrega una nueva línea al final de la string de entrada y, por lo tanto, cualquiera que sea la salida, al final, el cursor se moverá a la siguiente línea. Además, en caso de que se agreguen variables a la string de entrada, esta función garantizará que las variables estén separadas por un espacio en el medio. Además de imprimir, devuelve dos valores: el número de bytes escritos y un mensaje de error en caso de que se produzca algún error de escritura. |
|
Sprint funciona de la misma manera que lo hace Print. La única diferencia es que Sprint devuelve la string de entrada en lugar de imprimirla en la consola de salida. |
|
Sprintf funciona de la misma manera que lo hace Printf. La única diferencia es que Sprintf devuelve la string de entrada formateada en lugar de imprimirla en la consola de salida. | |
Sprintln funciona de la misma manera que lo hace Println. la única diferencia es que Sprintln devuelve la string de entrada en lugar de imprimirla en la consola de salida. |
|
A diferencia de otras funciones de impresión, Fprint no lee ni imprime nada en la consola. Fprint formatea la string de entrada según el formato predeterminado y escribe la string de entrada formateada en el archivo de entrada. Cada vez que se encuentran dos variables, fprint agrega automáticamente un espacio entre ellas. Además de escribir en el archivo, fprint devuelve dos valores: no. de bytes escritos y mensaje de error (si ocurre algún error). |
|
Similar a fprint, pero una diferencia que traza una línea entre los dos es que fprintf formatea de acuerdo con el formato especificado y no formatea de acuerdo con el formato predeterminado. Fprintf luego escribe la string de entrada formateada en el archivo usando. Además de escribir en el archivo, fprintf devuelve dos valores: no. de bytes se escriben y un mensaje de error (si ocurre algún error). |
|
Funciona exactamente igual que fprint. Un punto adicional en Fprintln es que se agrega una nueva línea. La string de entrada formateada se escribirá en el archivo mencionado con la ayuda de un escritor. Además de escribir en el archivo, fprintln devuelve dos valores: no. de bytes escritos y un mensaje de error (si ocurre algún error). | |
Scan recopila la entrada de la consola estándar y almacena esta entrada en argumentos sucesivos. Los valores que están separados por espacios o líneas nuevas se tratan como valores múltiples. Estos se almacenan en múltiples argumentos. Además del trabajo de escaneo en pantalla, Scan también devuelve dos valores: no. de bytes leídos desde la consola y un mensaje de error (si lo hay). | |
Al igual que scanf en lenguaje C, donde se menciona un especificador de formato y luego la dirección de la variable donde se almacenará el valor de entrada, Scanf en Go escanea el texto leído de la entrada estándar y lo almacena en los argumentos según el formato especificado. Además del trabajo de escaneo en pantalla, Scan también devuelve dos valores: no. de bytes leídos desde la consola y un mensaje de error (si lo hay). | |
Scanln funciona de manera similar a Scan, pero scanln deja de escanear en una nueva línea. Lo que significa que el último carácter de entrada debe ir seguido de una nueva línea para que Scanln deje de escanear. ¡También puede ser un Fin de archivo, sin contenido, sin escaneo! | |
Sscan funciona de manera similar a scan, excepto por la diferencia de que sscan recopila la entrada como la string de argumento y no la entrada de la pantalla de la consola en el formato predeterminado. Y al igual que los demás, devuelve los dos valores: número de bytes y mensaje de error (si lo hay). | |
Sscanf funciona de manera similar a scanf excepto por la diferencia de que sscanf recopila la entrada como la string de argumento y no la entrada de la pantalla de la consola en el formato mencionado. | |
Sscanln es similar a Sscan pero sscanln deja de escanear en una nueva línea. Lo que significa que el último carácter de entrada debe ir seguido de una nueva línea para que Sscanln deje de escanear. ¡También puede ser un Fin de archivo, sin contenido, sin escaneo! | |
A diferencia de otras funciones de exploración que recopilan información del usuario o de la consola del programa, en el formato predeterminado, Fscan lee el contenido o el texto del archivo de entrada y devuelve el número de elementos analizados. Se lee en cuanto a caracteres, la dirección de progreso depende de la ubicación del puntero que proporcione. | |
Fscanf funciona de manera similar a fscan. La única diferencia es que fscanf lee del lector en el formato especificado en lugar de seguir el formato predeterminado. El caso de coincidencia es sensible a palabras completas, espacios y líneas nuevas y, por lo tanto, la string de argumento y la string de texto deben coincidir por completo. Fscanf, además de leer los caracteres, también devuelve el número de elementos analizados. | |
Fscanln es similar a Fscan pero Fscanln deja de escanear en una nueva línea. Lo que significa que el último carácter de entrada debe ir seguido de una nueva línea para que Fscanln deje de escanear. ¡También puede ser un Fin de archivo, sin contenido, sin escaneo! | |
Errorf formatea de acuerdo con el especificador de formato mencionado y asigna esta string formateada a una variable. Este es el mensaje de error. Esta función le permite imprimir mensajes de error personalizados, según la voluntad del usuario, e imprimirlo en la consola como un mensaje de error. |
Además de las funciones, Go tiene algunas interfaces integradas en sus paquetes. El paquete “fmt” consta de las siguientes interfaces. La siguiente descripción proviene del sitio oficial de Go, puede hacer clic aquí para obtener más información.
TIPOS |
DESCRIPCIÓN |
---|---|
formateador |
Formateador es una interfaz que hace posible el formateo personalizado. Llamar al formato sería algo así como Printf(f), Fprintf(f), Sprintf(f), etc. para generar una salida con formato personalizado en la consola. |
GoStringer |
Cualquier valor de código que tenga un método GoString implementa directamente la interfaz GoStringer implícitamente. |
Estado de exploración |
La interfaz ScanState contiene la declaración de funciones valiosas como: ReadRune, UnreadRune, SkipSpace, Token, Width & Read. Básicamente, brindan más información sobre el estado del escáner personalizado. |
Escáner |
Todas las funciones de escaneo que usamos: Scan, Scanfand Scanln, etc., cada vez que se usan, hacen una llamada a la interfaz del escáner. La interfaz del escáner nos permite recopilar entradas a través de la consola y/o strings de argumentos de entrada. |
Estado |
Representa el estado de la impresora que se pasa a formatos específicos. También contiene información sobre banderas y opciones disponibles para el especificador de formato de la string de argumentos. |
Larguero |
Cualquier valor que contenga un método de string (que haga posible la conversión de un argumento de string en salida) y use el formato predeterminado, implementa directamente la interfaz Stringer. Por ejemplo: Imprimir, Sprint, etc. |
Básicamente, en Go para implementar cualquier interfaz, acabamos de aprender que no tenemos que hacer nada explícitamente. En su lugar, llamar a métodos específicos implementa automáticamente las interfaces para el usuario. Y es a través de la implementación de los métodos en las interfaces que permiten que un valor particular tome múltiples formas. Esto se denomina simplemente como polimorfismo. Resumiendo todo esto, las interfaces en go se implementan implícitamente cuando se llaman a sus métodos y las interfaces contribuyen al concepto de polimorfismo.
Códigos de muestra para el paquete fmt:
1. Funciones de impresión
Go
// Go code to visualise the differences // between various print functions in fmt package main import "fmt" func main() { // NOTE: // 1. Print(arg) prints arg as // it is on the console screen fmt.Print("Hello, welcome!") // OUTPUT: "Hello, welcome!" // Some variables to use in our code const x, id = "Ashika", 22 // 2. Printf(arg) first formats arg // and then prints on the console screen fmt.Printf("\n1. Name %q and ID %d found!\n", x, id) // OUTPUT: // 1. Name "Ashika" and ID 22 found! // 3. Println(arg) does not format arg // It simply prints arg, appends any values // mentioned after arg and appends spaces in // between and also appends a new line at the end fmt.Println("2. Name %q and ID %d found!", x, id) // OUTPUT: 2. Name %q and ID %d found! Ashika 22 // Print(arg) does not format, does not add // any spaces and does not append any newlines fmt.Print("3. Name %q and ID %d found!", x, id) // OUTPUT: 3. Name %q and ID %d found!Ashika22 // 4. Sprint(arg) works similar to Print(arg) // The key difference is: Sprint returns arg as // it is as mentioned in the paranthesis and // Print(arg) prints on console screen. res := fmt.Sprint("\n4. Name %q and ID %d found!", x, id) fmt.Println(res) // OUTPUT: // 4. Name %q and ID %d found!Ashika22 // 5. Sprintf(arg) works similar to Printf(arg) // The key difference is: Sprintf returns arg as // a formatted string as mentioned in the paranthesis // and Printf prints formatted arg on console screen res = fmt.Sprintf("5. Name %q and ID %d found!", x, id) fmt.Println(res) // OUTPUT: 5. Name "Ashika" and ID 22 found! // 6. Sprintln(arg) works similar to Println(arg) // The key difference is: Sprintln returns arg as // it is as mentioned in paranthesis and adds spaces // between variables and appends a newline to arg & // returns arg value while Println directly prints arg // onto the console screen. res = fmt.Sprintln("6. Name %q and ID %d found!", x, id) fmt.Print(res) // OUTPUT: 6. Name %q and ID %d found! Ashika 22 fmt.Print("Goodbye!") // OUTPUT: "Goodbye!" }
Producción:
Hello, welcome! 1. Name "Ashika" and ID 22 found! 2. Name %q and ID %d found! Ashika 22 3. Name %q and ID %d found!Ashika22 4. Name %q and ID %d found!Ashika22 5. Name "Ashika" and ID 22 found! 6. Name %q and ID %d found! Ashika 22 Goodbye!
2. Funciones de escaneo
Go
// Go code to demonstrate use & differences // between various scan functions in fmt package package main import "fmt" // Main function func main() { fmt.Print("Hello, welcome!\n") var y, z, age int var name string // Scan function will collect input // until a space is encountered // from console and stores it in y fmt.Scan(&y) fmt.Printf("Scan: Y = %d\n", y) // Scanf collects user input in // the specified format and stores it // in name and age respectively fmt.Scanf("%s", &name) fmt.Scanf("%d", &age) fmt.Printf("Scanf: Name = %s , Age = %d\n", name, age) // Scanln will not do nothing if // a newline is encountered else // it stores input value in z fmt.Scanln(&z) // In our case after entering age we press // enter so this Scanln gets skipped and // thus 0 is stored in z as 0 is the // default value of int variable in Go fmt.Printf("Scanln: Z = %d\n", z) var a string var g int // GFG is stored in a // 10 is stored in g // In case of any error, error message // is stored in err1 // Number of values encountered is stored in res1 res1, err1 := fmt.Sscan("GFG 10", &a, &g) // In case of any error, this block will execute if err1 != nil { panic(err1) } fmt.Printf("Sscan -> n = %d , string = %s %d \n", res1, a, g) // GFG is stored in a // 5 is stored in g // In case of any error, error message // is stored in err2 // Number of values encountered is stored in res2 res2, err2 := fmt.Sscanf("String is GFG with 5 iterations", "String is %s with %d iterations", &a, &g) // In case of any error, this block will execute if err2 != nil { panic(err2) } fmt.Printf("Sscanf -> n = %d , string = %s %d \n", res2, a, g) // GFG is stored in a // 17 is stored in g // In case a newline is encountered, // then Sscanln will raise a newline // panic error message // In case of any error, error message // is stored in err3 // Number of values encountered is stored in res3 res3, err3 := fmt.Sscanln("GFG 17", &a, &g) // In case of any error, this block will execute if err3 != nil { panic(err3) } fmt.Printf("Sscanln -> n = %d , string = %s %d \n", res3, a, g) fmt.Println("Goodbye!") }
Aporte:
10 Ashika 20
Producción:
Hello, welcome! Scan: Y = 10 Scanf: Name = Ashika , Age = 20 Scanln: Z = 0 Sscan -> n =2 , string = GFG 10 Sscanf -> n = 2 , string = GFG 5 Sscanln -> n = 2 , string = GFG 17 Goodbye!
3. Demostración de la función Errorf
Go
// Go code to demonstrate // the use of errorf function // in fmt package package main import "fmt" // Main function func main() { const lazy = "I'm very lazy today" // Errorf formats according to the format specifier and // returns the string as a value that satisfies the error // and this error string are stored in err err := fmt.Errorf("Throwing error because: %q", lazy) // err.Error() will return the error message // and Println will print it on the output console fmt.Println(err.Error()) }
Producción:
Throwing error because: "I'm very lazy today"
Salidas visuales de códigos de muestra en el código de Visual Studio:
Nota: El valor scanln muestra 0 como salida. Es así porque scanln podría incluso recopilar la entrada del usuario, la nueva línea de la entrada anterior ha obligado a scanln a dejar de recopilar la entrada del usuario. Y el valor predeterminado en Go for int es 0, por lo tanto, el valor 0 para Z.