github.com/tawesoft/golib/v2@v2.10.0/legacy/operator/example_test.go (about)

     1  // This example demonstrates using operators in lookup tables for a
     2  // command-line calculator program.
     3  package operator_test
     4  
     5  import (
     6      "bufio"
     7      "fmt"
     8      "os"
     9      "strconv"
    10      "strings"
    11  
    12      "github.com/tawesoft/golib/v2/legacy/operator"
    13  )
    14  
    15  type checkedOperation func(float64, float64) (float64, error)
    16  
    17  var reader = bufio.NewReader(os.Stdin)
    18  
    19  var operations = map[string]checkedOperation {
    20      "+": operator.Float64Checked.Binary.Add,
    21      "-": operator.Float64Checked.Binary.Sub,
    22      "*": operator.Float64Checked.Binary.Mul,
    23      "/": operator.Float64Checked.Binary.Div,
    24  }
    25  
    26  func getNumber(prompt string) float64 {
    27      for {
    28          fmt.Print(prompt)
    29          var text, _ = reader.ReadString('\n')
    30          var result, err = strconv.ParseFloat(strings.TrimSpace(text), 64)
    31          if err != nil {
    32              fmt.Printf("Sorry, try again. (%v)\n", err)
    33              continue
    34          }
    35          return result
    36      }
    37  }
    38  
    39  func getOperation(prompt string) checkedOperation {
    40      for {
    41          fmt.Print(prompt)
    42          var text, _ = reader.ReadString('\n')
    43          var operator, ok = operations[strings.TrimSpace(text)]
    44          if !ok {
    45              fmt.Println("Sorry, try again.")
    46              continue
    47          }
    48          return operator
    49      }
    50  }
    51  
    52  func Example() {
    53      var firstNumber = getNumber("Enter a number (then press enter): ")
    54      var operation = getOperation("Enter +, -, * or / (then press enter) for add, subtract, multiply, or divide: ")
    55      var secondNumber = getNumber("Enter another number (then press enter): ")
    56      var result, err = operation(firstNumber, secondNumber)
    57      if err != nil {
    58          fmt.Printf("Sorry, something went wrong: %v\n", err)
    59      } else {
    60          fmt.Printf("The result is %.2f!\n", result)
    61      }
    62  }