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("处理结束:错误已由调用方处理,程序继续运行") }