Golang新手求助:不理解Go语言错误处理机制,求代码审查指导

Golang新手求助:不理解Go语言错误处理机制,求代码审查指导 https://play.golang.org/p/SmN2Thnl1ie

7 回复

寻找一个小问题。

更多关于Golang新手求助:不理解Go语言错误处理机制,求代码审查指导的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢您抽出时间并提供帮助!

那么,你对这个描述到底有什么问题呢?

DV1:

在这段代码的末尾出现了一个错误 -

什么错误?

这真的是和playground里一样的代码吗?

playground里的错误很容易修复,只需删除标记的那行输出语句。那可能只是用于调试的。不过之后你会因为未定义的变量和未使用的值而遇到更多错误。

删除对未使用值的引用,或者先声明它们。使用那些未使用的值。

请提出具体的问题,而不是仅仅把没有注释的代码扔给我们。

抱歉。我完全是个论坛新手。只是想满足以下要求:

编写一个Go语言的冒泡排序程序。该程序应提示用户输入最多10个整数。程序应在一行上打印出这些整数,并按从小到大排序。使用你最喜欢的搜索工具查找冒泡排序算法的工作原理描述。

作为该程序的一部分,你应该编写一个名为BubbleSort()的函数,该函数接收一个整数切片作为参数且不返回任何值。BubbleSort()函数应修改切片,使其元素按排序顺序排列。

冒泡排序算法中的一个重复操作是交换操作,它交换切片中两个相邻元素的位置。你应该编写一个Swap()函数来执行此操作。你的Swap()函数应接收两个参数:一个整数切片和一个索引值i,该索引表示切片中的一个位置。Swap()函数不应返回任何值,但应交换切片中位置i和位置i+1的内容。

func main() {
    fmt.Println("hello world")
}

在这段代码的末尾出现了一个错误 -

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")
	}
}

主要改进点:

  1. 错误包装:使用fmt.Errorf配合%w动词包装错误,保留原始错误信息的同时添加上下文
  2. 错误检查:展示了errors.Is()的用法,这是Go 1.13引入的标准错误检查方式
  3. 错误传播:在processDivision中正确处理并返回错误,而不是在函数内部处理
  4. 错误链:通过错误包装创建完整的错误调用链,便于调试

错误处理最佳实践:

  • 函数应返回错误而不是panic
  • 错误信息应具有上下文
  • 使用errors.Iserrors.As进行错误检查
  • 考虑错误是否需要暴露给调用者处理

你的原始代码结构正确,但缺少错误传播和上下文信息。上述修改展示了完整的错误处理流程。

回到顶部