How to parse multiple inputs from user in Golang

In this article, we will be discussing and writing practical code on how to take or parse multiple inputs from users in Golang.

 

Different methods to parse multiple inputs from user

Golang is a procedural language, Reading a user's inputs requires variables assigning, processing it into the standard output such as a monitor. Golang provides standard libraries such as fmt and bufio packages, help us with various function in reading and displaying users inputs. In a nutshell, reading inputs involves:-

Advertisement
  • using a standard package that has input and output functions.
  • Declare a variable that holds the inputs to be displayed.i.e var variableName datatype
  • Using a standard library like fmt.Scan() to read and store input into variable defined.

The following are functions used to read users' inputs in Golang:-

  • fmt.Scanln()
  • fmt.Scanf()
  • bufio.NewReader()

 

Method 1:- fmt.Scanln()

Golang fmt package does not only provide us with the capability to format data into various forms and print the output on the terminal, Its robust in the way to lets users enter multiple values stored into a various variables to hold respective inputs of different types using fmt.Scanln(). It's one of the examples of vardiac functions used in golang. It accepts an ellipses of data interface, i.e func Scanln( val ...anyType)(return integerValue, error). It returns a response of integer and error types. All inputs are captured in a single sentence. The integer value represents the total number of inputs provided For example Reading user information into a struct.

package main

import (
	"fmt"
)

type Person struct {
	FullName             string
	TelephoneNo          int64
	Occupation           string
	Country_Of_Residence string
}

func main() {
	fmt.Println("Kindly enter your data in following order: ")
	var firstname, lastname, occupation, country string
	var phoneNo int64
	fmt.Println(" firstname, lastname, occupation, country, phoneNo")
	totalInputs, errReading := fmt.Scanln(&firstname, &lastname, &country, &occupation, &phoneNo)
	if errReading != nil {
		fmt.Printf("Your input could not be read%v", errReading)
	}
	//fullname
	fullname := fmt.Sprintf("%v %v", firstname, lastname)
	// map values into struct
	person := Person{
		fullname,
		phoneNo,
		occupation,
		country,
	}

	fmt.Printf(" you entered a total of %v items into scanln function", totalInputs)
	fmt.Println("\n----------Your Data is as follows .........")
	fmt.Println("\nFullName\tPhoneNo\tOccupation\tCountry of Residence ")
	fmt.Println(person)

}

Output:

$ go run main.go 
Kindly enter your data in the following order: 
 firstname, lastname, occupation, country, phoneNo
John Doe USA DataScientist 01233333
 you entered a total of 5 items into scanln function
----------Your Data is as follows .........

FullName        PhoneNo Occupation      Country of Residence 
{John Doe 341723 DataScientist USA}

Explanation:- In the above code, we declare variables to hold various input values. Reading is made by fmt.Scanln() function, which gets a pointer to the variable defined. It returns the total number of inputs made by the user. we can map the values into a struct and print out the results.

 

Method 2:- fmt.Scanf()

fmt.Scanf()is a function provided by the fmt package in Golang standard libraries. It reads users' inputs values in the standard input (stdin) and this values format i.e "%v, %s,%2f" is determined then stored in a variable. For example of multiple inputs:-

package main

import (
	"fmt"
)

func areaTriangle(base, height float64) float64 {
	return 0.5 * base * height
}

func main() {
	var base, height float64
	fmt.Println("Kindly enter the base and height values, separated by space  to determine the area of a triangle")
	_, err := fmt.Scanf("%2f %2f", &base, &height)
	if err != nil {
		fmt.Printf("Sorry an error occurred %v", err)
	}
	result := areaTriangle(base, height)
	fmt.Printf("The area of the triangle is %v", result)

}

Output:

Advertisement
$  go run main.go 
Kindly enter the base and height values, separated by space  to determine the area of a triangle
3 4

The area of the triangle is 6

Explanation: In above code, we are reading data of type float64 and using "%2f" convert it to a specific float format, then the variable values are passed to areaTriangle() function to calculate the area , results displayed on the terminal.

 

Method 3:- bufio.NewReader()

Using golang standard library one can create a command line interface known as CLI. This tool is just an emulation of Terminal in macOS and Linux or PowerShell in windows operating systems. Here users can type a whole sentence or short sentences. Golang provides us with bufio.NewReader() which can read and store users' input into a variable. It Golang function that returns multiple values. For example :

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func main() {
	fmt.Println("Kindly Provide a brief Description of GolinuxCloud company:  once done typing, kindly tap enter button to display your content.")
	// using standard input in this case its the terminal
	// once done 
	userData, err := bufio.NewReader(os.Stdin).ReadString('\n');
	if err != nil {
		_ = fmt.Errorf(" %v error", err)
		return
	}
	// Display user's data stdout
	results:= strings.TrimSuffix(userData, "\n")
	fmt.Printf("Results you Provided: \n %v", results)

}

Output:-

$ go run main.go
Kindly Provide a brief Description of the GolinuxCloud company: 
It's an online academic platform, It's enriched with numerous technology materials. DevOps, Web, IOS, and Android developer visit here for upskilling....
Results you Provided: 
 It's an online academic platform, It's enriched with numerous technology materials. DevOps, Web, IOS, and Android developer visit here for upskilling....

Explanation:- In the above code, we are making use of bufio.NewReader() function, from bufio package in golang standard library. It takes parameters implemented by io.Reader packages such as os.Stdin or StdEr etc. os.StdIn works as an interface and opens the file that points to standard inputs i.e command line interface or terminal. The last event of delimeter() known as '\n' refers to enter key which inserts a new line using the ReadString() function and returns data containing the delimiter. Here the sentence ends with the '\n' character and we have to remove it using string.TrimSuffix() method allows us to pass the data followed by the special character to remove. upon tapping enter key. we use the fmt.Printf() function to display the user's results content on the terminal.

 

Summary

In a nutshell, in this article, we have discussed a few ways we can read users' inputs from the standard input and display using standard output i.e terminal. Using golang you can develop different tools to interact with the command line interface. You can read more about cobra framework for developing CLI applications in golang. Flags and OS packages too can help you design a well-programmed CLI of your choice.

 

References

Multiple input reading

 

Didn't find what you were looking for? Perform a quick search across GoLinuxCloud

If my articles on GoLinuxCloud has helped you, kindly consider buying me a coffee as a token of appreciation.

Buy GoLinuxCloud a Coffee

For any other feedbacks or questions you can either use the comments section or contact me form.

Thank You for your support!!

Leave a Comment

X