Golang新手求助:不理解Go语言错误处理机制,求代码审查指导
Golang新手求助:不理解Go语言错误处理机制,求代码审查指导 https://play.golang.org/p/SmN2Thnl1ie
7 回复
寻找一个小问题。
更多关于Golang新手求助:不理解Go语言错误处理机制,求代码审查指导的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
那么,你对这个描述到底有什么问题呢?
DV1:
在这段代码的末尾出现了一个错误 -
什么错误?
这真的是和playground里一样的代码吗?
playground里的错误很容易修复,只需删除标记的那行输出语句。那可能只是用于调试的。不过之后你会因为未定义的变量和未使用的值而遇到更多错误。
删除对未使用值的引用,或者先声明它们。使用那些未使用的值。
请提出具体的问题,而不是仅仅把没有注释的代码扔给我们。
在这段代码的末尾出现了一个错误 -
package main
import (
"fmt"
)
var toBeSorted = [10]int{1, 3, 2, 4, 8, 6, 7, 2, 3, 0}
func bubbleSort(input [10]int) {
// n 是我们列表中的项目数量
n := 10
// 将 swapped 设置为 true
swapped := true
// 循环
for swapped {
// 将 swapped 设置为 false
swapped = false
// 遍历列表中的所有元素
for i := 1; i < n; i++ {
// 如果当前元素大于下一个元素,则交换它们
if input[i-1] > input[i] {
// 记录我们正在交换值以便追溯
fmt.Println("Swapping")
// 使用 Go 的元组赋值交换值
input[i], input[i-1] = input[i-1], input[i]
// 将 swapped 设置为 true - 这很重要
// 如果循环结束且 swapped 仍然等于 false,
// 我们的算法将假定列表已完全排序。
swapped = true
}
}
}
// 最后,打印出排序后的列表
fmt.Println(input)
func(sli []int) {
sli[0] = sli[0] + 1
if err != nil {
fmt.Println(err)
}
i := []int{1}
sli = i
fmt.Println((int)sli + 1)
return
// func main() {
// fmt.Println("Hello World")
// BubbleSort(toBeSorted)
// }
}
}
你的代码展示了Go语言错误处理的基本模式,但有几个关键点需要改进。以下是具体分析和修改建议:
package main
import (
"errors"
"fmt"
)
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil
}
func processDivision(x, y float64) error {
result, err := divide(x, y)
if err != nil {
return fmt.Errorf("processDivision failed: %w", err)
}
fmt.Printf("Result: %.2f\n", result)
return nil
}
func main() {
// 测试正常情况
if err := processDivision(10, 2); err != nil {
fmt.Printf("Error: %v\n", err)
}
// 测试除零错误
if err := processDivision(10, 0); err != nil {
fmt.Printf("Error: %v\n", err)
}
// 使用errors.Is检查特定错误
_, err := divide(5, 0)
if errors.Is(err, errors.New("division by zero")) {
fmt.Println("Caught division by zero error")
}
}
主要改进点:
- 错误包装:使用
fmt.Errorf配合%w动词包装错误,保留原始错误信息的同时添加上下文 - 错误检查:展示了
errors.Is()的用法,这是Go 1.13引入的标准错误检查方式 - 错误传播:在
processDivision中正确处理并返回错误,而不是在函数内部处理 - 错误链:通过错误包装创建完整的错误调用链,便于调试
错误处理最佳实践:
- 函数应返回错误而不是panic
- 错误信息应具有上下文
- 使用
errors.Is和errors.As进行错误检查 - 考虑错误是否需要暴露给调用者处理
你的原始代码结构正确,但缺少错误传播和上下文信息。上述修改展示了完整的错误处理流程。


