题目
从之前的练习中复制 Sqrt 函数,修改它使其返回 error 值。
Sqrt 接受到一个负数时,应当返回一个非 nil 的错误值。复数同样也不被支持。
创建一个新的类型
type ErrNegativeSqrt float64
并为其实现
func (e ErrNegativeSqrt) Error() string
方法使其拥有 error 值,通过 ErrNegativeSqrt(-2).Error() 调用该方法应返回 “cannot Sqrt negative number: -2”。
注意: 在 Error 方法内调用 fmt.Sprint(e) 会让程序陷入死循环。可以通过先转换 e 来避免这个问题:fmt.Sprint(float64(e))。这是为什么呢?
修改 Sqrt 函数,使其接受一个负数时,返回 ErrNegativeSqrt 值。
package main
import (
"fmt"
)
func Sqrt(x float64) (float64, error) {
return 0, nil
}
func main() {
fmt.Println(Sqrt(2))
fmt.Println(Sqrt(-2))
}
要解决这个问题,我们需要为负数平方根操作定义一个自定义错误类型,并确保Sqrt函数正确处理负数和返回这种错误。
问题分析
- 自定义错误类型:需要创建一个
ErrNegativeSqrt类型并实现error接口的Error()方法。 - 避免递归格式化:在
Error()方法中直接格式化ErrNegativeSqrt实例会导致死循环,必须转换为底层类型。 - Sqrt函数逻辑:输入为负数时返回自定义错误,非负数时计算结果。
解决代码
package main
import (
"fmt"
"math"
)
type ErrNegativeSqrt float64
// 实现error接口,String转换为底层float64避免递归
func (e ErrNegativeSqrt) Error() string {
return fmt.Sprintf("cannot Sqrt negative number: %v", float64(e))
}
func Sqrt(x float64) (float64, error) {
if x < 0 {
return 0, ErrNegativeSqrt(x) // 返回自定义错误
}
return math.Sqrt(x), nil
}
func main() {
fmt.Println(Sqrt(2)) // 正确计算结果
fmt.Println(Sqrt(-2)) // 返回错误信息
}
代码解释
-
类型定义:
type ErrNegativeSqrt float64定义一个继承自
float64的新类型来保存导致错误的负数值。 -
错误实现:
func (e ErrNegativeSqrt) Error() string { return fmt.Sprintf("cannot Sqrt negative number: %v", float64(e)) }将类型转换为
float64后进行格式化,避免调用自身Error()方法造成递归。 -
核心逻辑:
if x < 0 { return 0, ErrNegativeSqrt(x) } return math.Sqrt(x), nil输入校验和处理路径分离,负数直接返回错误,正数调用标准库函数处理。
输出验证
执行后会得到以下结果:
1.4142135623730951 <nil>
0 cannot Sqrt negative number: -2
第一行正确计算了平方根,第二行返回详细的错误信息,符合题目要求。

6345

被折叠的 条评论
为什么被折叠?



