Developing a statistics application
In this section, we are going to develop a basic statistics application stored in stats.go
. The statistical application is going to be improved and enriched with new features throughout this book.
The first part of stats.go
is the following:
package main
import (
"fmt"
"math"
"os"
"strconv"
)
func main() {
arguments := os.Args
if len(arguments) == 1 {
fmt.Println("Need one or more arguments!")
return
}
In this first part of the application, the necessary Go packages are imported before the main()
function makes sure that we have at least a single command line parameter to work with, using len(arguments) == 1
.
The second part of stats.go
is the following:
var min, max float64
var initialized = 0
nValues := 0
var sum float64
for i := 1; i < len(arguments); i++ {
n, err := strconv.ParseFloat(arguments[i], 64)
if err != nil {
continue
}
nValues = nValues + 1
sum = sum + n
if initialized == 0 {
min = n
max = n
initialized = 1
continue
}
if n < min {
min = n
}
if n > max {
max = n
}
}
fmt.Println("Number of values:", nValues)
fmt.Println("Min:", min)
fmt.Println("Max:", max)
In the previous code excerpt, we process all valid inputs to count the number of valid values and find the minimum and the maximum values among them.
The last part of stats.go
is the following:
// Mean value
if nValues == 0 {
return
}
meanValue := sum / float64(nValues)
fmt.Printf("Mean value: %.5f\n", meanValue)
// Standard deviation
var squared float64
for i := 1; i < len(arguments); i++ {
n, err := strconv.ParseFloat(arguments[i], 64)
if err != nil {
continue
}
squared = squared + math.Pow((n-meanValue), 2)
}
standardDeviation := math.Sqrt(squared / float64(nValues))
fmt.Printf("Standard deviation: %.5f\n", standardDeviation)
}
In the previous code excerpt, we find the mean value because this cannot be computed without processing all values first. After that, we process each valid value to compute the standard deviation because the mean value is required in order to compute the standard deviation.
Running stats.go
generates the following kind of output:
$ go run stats.go 1 2 3
Number of values: 3
Min: 1
Max: 3
Mean value: 2.00000
Standard deviation: 0.81650