diff --git a/go/01-basics/calculator.go b/go/01-basics/calculator.go index 7686df8..19af19d 100644 --- a/go/01-basics/calculator.go +++ b/go/01-basics/calculator.go @@ -5,18 +5,46 @@ import ( ) func main() { + const ( + add = "add" + subtract = "subtract" + multiply = "multiply" + divide = "divide" + exit = "exit" + ) - //TODO: implement according to README.md + fmt.Println("Welcome to the Simple Calculator!") + for { + var operation string + fmt.Print("\nEnter operation (add, subtract, multiply, divide, exit): ") + fmt.Scan(&operation) - //the following code just demonstrates how to use fmt.Scan + if operation == exit { + fmt.Println("Goodbye!") + break + } - var str string - fmt.Print("Please enter a string: ") - fmt.Scan(&str) + var num1, num2 float64 + fmt.Print("Enter the first number: ") + fmt.Scan(&num1) + fmt.Print("Enter the second number: ") + fmt.Scan(&num2) - var x float64 - fmt.Print("Please enter a float: ") - fmt.Scan(&x) - - fmt.Printf("You entered '%s' and %f\n", str, x) + switch operation { + case add: + fmt.Printf("Result: %.2f\n", num1+num2) + case subtract: + fmt.Printf("Result: %.2f\n", num1-num2) + case multiply: + fmt.Printf("Result: %.2f\n", num1*num2) + case divide: + if num2 == 0 { + fmt.Println("Error: Division by zero is not allowed!") + } else { + fmt.Printf("Result: %.2f\n", num1/num2) + } + default: + fmt.Println("Invalid operation. Please try again.") + } + } } diff --git a/go/01-basics/slice.go b/go/01-basics/slice.go new file mode 100644 index 0000000..c5d3fcc --- /dev/null +++ b/go/01-basics/slice.go @@ -0,0 +1,31 @@ +package main + +import ( + "fmt" + "runtime" +) + +func main() { + //create an array with a lot of data + massiveData := make([]int, 1_000_000) + for i := range massiveData { + massiveData[i] = i + } + + // Task: Extract the first 8 elements safely + + //1. attempt: use the slice operator + //smallSlice := massiveData[:8] + // consequence -> smallSlice and massiveData point to the same underlying array. + // Therefore, setting massiveData to nil is not sufficient to release that big array. + + //2. attempt: create a new slice (with a new underlying array) and copy data + smallSlice := make([]int, 8) + copy(smallSlice, massiveData[:8]) + + massiveData = nil //don't use massive data anymore: Underlying array shall be freed. + runtime.GC() //run the garbage collector to make sure that all unused data is actually freed + + //cap(smallSlice) should be 8 or similar, but not close to 1_000_000. The majority of the data should have been released by now + fmt.Printf("Small Slice: %v, Len: %d, Cap: %d\n", smallSlice, len(smallSlice), cap(smallSlice)) +}