Hey, started learning Golang by implementing a most basic CLI based calculator .

The file structure , codes and the Screenshots are given below.

>>File Structure

cli-calculator/ ├── main.go ├── go.mod ├── calculator/ │ ├── add.go │ ├── subtract.go │ ├── multiply.go │ └── divide.go └── utils/ └── input.go

>>Initialize the module

mkdir cli-calculator
cd cli-calculator
go mod init cli-calculator

>>CODE

—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
}