'golang signal SIGSEGV: segmentation violation

I am trying higher order function in golang. It is panicking in printResult function at line containing "result := calcFunction(radius)". Can anybody help me as what I am doing wrong here.

package main

import "fmt"

func calcArea(r float64) float64 {
    return 3.14 * r * r
}

func calcPerimeter(r float64) float64 {
    return 2 * 3.14 * r
}

func calcDiameter(r float64) float64 {
    return 2 * r
}

func getFunction(query int) func(r float64) float64 {

    query_to_func := map[int]func(r float64) float64{
        1: calcArea,
        2: calcPerimeter,
        3: calcDiameter,
    }
    return query_to_func[query]

}

func printResult(radius float64, calcFunction func(r float64) float64) {
    result := calcFunction(radius)
    fmt.Println("Result:", result)
}

func main() {
    var query int
    var radius float64

    fmt.Print("Enter the radius of the circle: ")
    fmt.Scanf("%f", &radius)
    fmt.Print("Enter operation: \n 1: Area\n 2: Perimeter\n 3: Diameter \n :")
    fmt.Scanf("%f", &query)
    printResult(radius, getFunction(query))

}


Solution 1:[1]

Problem is with the fmt.Scanf("%f", &query). query is int and you are scanning to %f(float64). So the value become 0. Since map does not have that value, it panics.

func main() {
    var query int
    var radius float64

    fmt.Print("Enter the radius of the circle: ")
    fmt.Scanf("%f", &radius)
    fmt.Print("Enter operation: \n 1: Area\n 2: Perimeter\n 3: Diameter \n :")
    fmt.Scanf("%d", &query)
    printResult(radius, getFunction(query))
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Pratheesh M