| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- package main
- import (
- "errors"
- "fmt"
- "strconv"
- )
- // 1. 常见返回形式:(计算结果, 错误)。
- // 成功时 error 返回 nil,失败时返回描述原因的错误值。
- func divide(a, b int) (float64, error) {
- if b == 0 {
- return 0, errors.New("除数不能为 0")
- }
- return float64(a) / float64(b), nil
- }
- // 2. fmt.Errorf 可以像 Printf 一样,将具体数据放进错误信息。
- func validateScore(score int) error {
- if score < 0 || score > 100 {
- return fmt.Errorf("成绩 %d 无效,应在 0~100 之间", score)
- }
- return nil
- }
- // 3. 调用可能失败的函数后,先检查错误,再使用结果。
- // 下层函数返回错误时,可以直接把错误交给上层调用方。
- func parseScore(text string) (int, error) {
- score, err := strconv.Atoi(text) // Atoi 将字符串转换为 int。
- if err != nil {
- return 0, err
- }
- err = validateScore(score)
- if err != nil {
- return 0, err
- }
- return score, nil
- }
- func main() {
- fmt.Println("=== 成功返回 nil ===")
- result, err := divide(10, 4)
- if err != nil {
- fmt.Println("计算失败:", err)
- } else {
- fmt.Printf("10 / 4 = %.2f\n", result)
- }
- fmt.Println("\n=== 失败返回原因 ===")
- result, err = divide(10, 0)
- if err != nil {
- fmt.Println("计算失败:", err)
- } else {
- fmt.Printf("计算结果:%.2f\n", result)
- }
- fmt.Println("\n=== 只有 error 返回值 ===")
- err = validateScore(120)
- if err != nil {
- fmt.Println("校验失败:", err)
- }
- fmt.Println("\n=== 字符串转换与错误传递 ===")
- inputs := []string{"85", "0", "120", "abc"}
- for _, input := range inputs {
- score, err := parseScore(input)
- if err != nil {
- fmt.Printf("输入 %q 失败:%v\n", input, err)
- continue // 本次失败不使用 score,继续处理下一项。
- }
- fmt.Printf("输入 %q 成功:成绩=%d\n", input, score)
- }
- fmt.Println("处理结束:错误已由调用方处理,程序继续运行")
- }
|