Hey, started learning Golang by implementing a most basic CLI based calculator .
The file structure , codes and the Screenshots are given below.
cli-calculator/ ├── main.go ├── go.mod ├── calculator/ │ ├── add.go │ ├── subtract.go │ ├── multiply.go │ └── divide.go └── utils/ └── input.go
mkdir cli-calculator
cd cli-calculator
go mod init cli-calculator
—MAIN.GO—
package main
import (
"fmt"
"cli-calculator/calculator"
"cli-calculator/utils"
)
func main() {
fmt.Println("CLI Calculator in Go")
fmt.Println("---------------------")
fmt.Println("Choose operation:")
fmt.Println("1. Add")
fmt.Println("2. Subtract")
fmt.Println("3. Multiply")
fmt.Println("4. Divide")
fmt.Println("5. Power")
choice := utils.ReadChoice("Enter your choice (1-5): ")
num1 := utils.ReadFloat("Enter first number: ")
num2 := utils.ReadFloat("Enter second number: ")
fmt.Println("Thanks for your input!")
fmt.Println("You chose:", choice)
fmt.Println("First Input:", num1)
fmt.Println("Second Input:", num2)
//Output labels
add_label := fmt.Sprintf("The result of (%f + %f) = ", num1, num2)
switch choice {
case 1:
result := calculator.Add(num1, num2)
fmt.Println(add_label, result)
fmt.Println("Result:", result)
case 2:
result := calculator.Subtract(num1, num2)
fmt.Println("Result:", result)
case 3:
result := calculator.Multiply(num1, num2)
fmt.Println("Result:", result)
case 4:
result, err := calculator.Divide(num1, num2)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
case 5:
result, err := calculator.Power(num1, num2)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
default:
fmt.Println("Invalid choice")
}
}
—input.go—
package utils
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
//Functions to read user input from the command line
// ReadFloat reads a float64 number from the command line with a prompt
func ReadFloat(prompt string) float64 {
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print(prompt)
input, _ := reader.ReadString('\\n')
input = strings.TrimSpace(input)
num, err := strconv.ParseFloat(input, 64)
if err == nil {
return num
}
fmt.Println("Invalid number. Please try again.")
}
}
// ReadChoice reads an integer choice from the command line with a prompt
// It expects the user to enter a number between 1 and 4
func ReadChoice(prompt string) int {
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print(prompt)
input, _ := reader.ReadString('\\n')
input = strings.TrimSpace(input)
num, err := strconv.Atoi(input)
if err == nil {
if num >= 1 && num <= 4 {
return num
} else {
fmt.Println("Invalid input. Please enter a number between 1 and 4.")
}
} else {
fmt.Println("Invalid input. Please enter a valid Choice from the menu.")
}
}
}
—add.go—
package calculator
func Add(a, b float64) float64 {
return a + b
}
—subract.go—
package calculator
func Subtract(a, b float64) float64 {
return a - b
}
—multiply.go—
package calculator
func Multiply(a, b float64) float64 {
return a*b
}