如何优雅的在 Go 语言中处理被除数为零?

题目描述

如何优雅的在 Go 语言中解决被除数为零?

题目来源及自己的思路

如果在 Go 语言中,被除数为零,假设出现了下面的代码:

package main

import "fmt"

func main() {
    fmt.Println(1 / 0)
}

运行的话,会得到一个 invalid operation: division by zero 的错误,想请教大佬们,目前最直观能想到的一个方式就是捕获,但是 Go 语言又没有 try...catch 语句,所以赶来请问各位大佬,如何优雅的在 Go 语言中解决被除数为零?

但是如果是浮点数的除法,运行下面的代码,不会出错:

package main

import "fmt"

func main() {
    foo := -0.0
    fmt.Println(1.0 / foo)
}

这又是为什么呢?

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
阅读 2.6k
4 个回答

整数除法,可以除之前判断一下除数是不是零。

浮点除法,除数为零会得到 Inf 或者 Nan ,并不会 panic 。

人工智能的回答,哈哈😄😄

// To gracefully handle division by zero in Go, we can use a defer statement to recover from a runtime panic that occurs when dividing by zero.
// Here is an example:

func divide(a, b int) (result int, err error) {
    defer func() {
        if r := recover(); r != nil {
            err = fmt.Errorf("runtime error: %v", r)
        }
    }()
    result = a / b
    return result, nil
}

// In the above code, we use a defer statement to recover from a runtime panic that occurs when dividing by zero. 
// The recover function returns the value passed to the panic function, which in this case is the runtime error message. 
// We then use the fmt.Errorf function to create a new error object with the error message. 
// Finally, we return the error object along with the result of the division.

在 Go 语言中,可以使用 panic 函数来处理除数为零的情况。然而,这并不是一种优雅的方法,因为 panic 函数会中断程序的正常执行流程,并且不是所有情况下都适用。

一种更优雅的方法是使用 Go 语言中的错误处理机制。例如,我们可以使用一个自定义的错误类型来表示除数为零的错误,如下所示:

type ZeroDivisionError struct {
    message string
}

func (e *ZeroDivisionError) Error() string {
    return e.message
}

func divide(dividend, divisor float64) (float64, error) {
    if divisor == 0 {
        return 0, &ZeroDivisionError{"division by zero"}
    }
    return dividend / divisor, nil
}

在这个例子中,我们定义了一个名为 ZeroDivisionError 的错误类型,它包含一个错误信息。我们还定义了一个名为 divide 的函数,它接受两个浮点数类型的参数,并返回它们的商和一个错误。在函数中,我们首先检查除数是否为零,如果是,我们返回一个指向 ZeroDivisionError 结构体的指针和一个自定义的错误信息;否则,我们计算商并返回它。

使用上面的函数的例子:

result, err := divide(10.0, 2.0)
if err != nil {
    fmt.Println(err)
} else {
    fmt.Println(result)
}

在这个例子中,我们调用 divide 函数,并检查返回的错误。如果错误不是 nil,我们打印错误信息,否则打印计算结果。

通过这种方式,我们可以更优雅地处理除数为零的情况,并在程序中保持正常执行流程。同时,我们还可以通过自定义错误类型来提供更多有用的错误信息,以便更好地理解错误发生的原因。

go 本身就是个流程化的处理语言;执行前检查下被除数就是了。

if b == 0 {
return fmt.Errorf("除数不能 为 0")
}

fmt.Println(a/b)

另外我建议呢,你要搞懂golang的错误处理风格,并不是说他没有 try...catch,golang本身的错误处理就是,每个函数或者说方法最后一位用来放error,执行的时候向上返回,上层检查,如此这边直到一开始的调用位置决定最终怎么处理,是抛弃掉处理结果呢,还是告知用户呢,还是决定直接停止程序执行。当然,每一步检查你都可以自行决定是做这些操作还是向上返回。

反正就是每做一件事先做错误检查,没错就继续搞,有错就返回。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏