main.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "strconv"
  6. )
  7. // 1. 常见返回形式:(计算结果, 错误)。
  8. // 成功时 error 返回 nil,失败时返回描述原因的错误值。
  9. func divide(a, b int) (float64, error) {
  10. if b == 0 {
  11. return 0, errors.New("除数不能为 0")
  12. }
  13. return float64(a) / float64(b), nil
  14. }
  15. // 2. fmt.Errorf 可以像 Printf 一样,将具体数据放进错误信息。
  16. func validateScore(score int) error {
  17. if score < 0 || score > 100 {
  18. return fmt.Errorf("成绩 %d 无效,应在 0~100 之间", score)
  19. }
  20. return nil
  21. }
  22. // 3. 调用可能失败的函数后,先检查错误,再使用结果。
  23. // 下层函数返回错误时,可以直接把错误交给上层调用方。
  24. func parseScore(text string) (int, error) {
  25. score, err := strconv.Atoi(text) // Atoi 将字符串转换为 int。
  26. if err != nil {
  27. return 0, err
  28. }
  29. err = validateScore(score)
  30. if err != nil {
  31. return 0, err
  32. }
  33. return score, nil
  34. }
  35. func main() {
  36. fmt.Println("=== 成功返回 nil ===")
  37. result, err := divide(10, 4)
  38. if err != nil {
  39. fmt.Println("计算失败:", err)
  40. } else {
  41. fmt.Printf("10 / 4 = %.2f\n", result)
  42. }
  43. fmt.Println("\n=== 失败返回原因 ===")
  44. result, err = divide(10, 0)
  45. if err != nil {
  46. fmt.Println("计算失败:", err)
  47. } else {
  48. fmt.Printf("计算结果:%.2f\n", result)
  49. }
  50. fmt.Println("\n=== 只有 error 返回值 ===")
  51. err = validateScore(120)
  52. if err != nil {
  53. fmt.Println("校验失败:", err)
  54. }
  55. fmt.Println("\n=== 字符串转换与错误传递 ===")
  56. inputs := []string{"85", "0", "120", "abc"}
  57. for _, input := range inputs {
  58. score, err := parseScore(input)
  59. if err != nil {
  60. fmt.Printf("输入 %q 失败:%v\n", input, err)
  61. continue // 本次失败不使用 score,继续处理下一项。
  62. }
  63. fmt.Printf("输入 %q 成功:成绩=%d\n", input, score)
  64. }
  65. fmt.Println("处理结束:错误已由调用方处理,程序继续运行")
  66. }