golang信号SIGSEGV:分段违规

huangapple go评论109阅读模式
英文:

golang signal SIGSEGV: segmentation violation

问题

我正在尝试在Go语言中使用高阶函数。在包含"result := calcFunction(radius)"的行中,printResult函数发生了panic。有人可以帮我看看我在这里做错了什么吗?

  1. package main
  2. import "fmt"
  3. func calcArea(r float64) float64 {
  4. return 3.14 * r * r
  5. }
  6. func calcPerimeter(r float64) float64 {
  7. return 2 * 3.14 * r
  8. }
  9. func calcDiameter(r float64) float64 {
  10. return 2 * r
  11. }
  12. func getFunction(query int) func(r float64) float64 {
  13. query_to_func := map[int]func(r float64) float64{
  14. 1: calcArea,
  15. 2: calcPerimeter,
  16. 3: calcDiameter,
  17. }
  18. return query_to_func[query]
  19. }
  20. func printResult(radius float64, calcFunction func(r float64) float64) {
  21. result := calcFunction(radius)
  22. fmt.Println("Result:", result)
  23. }
  24. func main() {
  25. var query int
  26. var radius float64
  27. fmt.Print("Enter the radius of the circle: ")
  28. fmt.Scanf("%f", &radius)
  29. fmt.Print("Enter operation: \n 1: Area\n 2: Perimeter\n 3: Diameter \n :")
  30. fmt.Scanf("%d", &query)
  31. printResult(radius, getFunction(query))
  32. }

你可以尝试将fmt.Scanf("%f", &query)改为fmt.Scanf("%d", &query),因为query是一个整数,而不是浮点数。这可能是导致panic的原因。

英文:

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.

  1. package main
  2. import "fmt"
  3. func calcArea(r float64) float64 {
  4. return 3.14 * r * r
  5. }
  6. func calcPerimeter(r float64) float64 {
  7. return 2 * 3.14 * r
  8. }
  9. func calcDiameter(r float64) float64 {
  10. return 2 * r
  11. }
  12. func getFunction(query int) func(r float64) float64 {
  13. query_to_func := map[int]func(r float64) float64{
  14. 1: calcArea,
  15. 2: calcPerimeter,
  16. 3: calcDiameter,
  17. }
  18. return query_to_func[query]
  19. }
  20. func printResult(radius float64, calcFunction func(r float64) float64) {
  21. result := calcFunction(radius)
  22. fmt.Println("Result:", result)
  23. }
  24. func main() {
  25. var query int
  26. var radius float64
  27. fmt.Print("Enter the radius of the circle: ")
  28. fmt.Scanf("%f", &radius)
  29. fmt.Print("Enter operation: \n 1: Area\n 2: Perimeter\n 3: Diameter \n :")
  30. fmt.Scanf("%f", &query)
  31. printResult(radius, getFunction(query))
  32. }

答案1

得分: 3

问题出在fmt.Scanf("%f", &query)这一行。query是int类型,而你正在使用%f(float64)进行扫描。因此,值变为0。由于映射中没有该值,所以会引发错误。

  1. func main() {
  2. var query int
  3. var radius float64
  4. fmt.Print("Enter the radius of the circle: ")
  5. fmt.Scanf("%f", &radius)
  6. fmt.Print("Enter operation: \n 1: Area\n 2: Perimeter\n 3: Diameter \n :")
  7. fmt.Scanf("%d", &query)
  8. printResult(radius, getFunction(query))
  9. }
英文:

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.

  1. func main() {
  2. var query int
  3. var radius float64
  4. fmt.Print("Enter the radius of the circle: ")
  5. fmt.Scanf("%f", &radius)
  6. fmt.Print("Enter operation: \n 1: Area\n 2: Perimeter\n 3: Diameter \n :")
  7. fmt.Scanf("%d", &query)
  8. printResult(radius, getFunction(query))
  9. }
  10. </details>

huangapple
  • 本文由 发表于 2022年3月14日 12:59:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/71463164.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定