【GO语言】练习:Errors

题目

从之前的练习中复制 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函数正确处理负数和返回这种错误。

问题分析

  1. 自定义错误类型:需要创建一个ErrNegativeSqrt类型并实现error接口的Error()方法。
  2. 避免递归格式化:在Error()方法中直接格式化ErrNegativeSqrt实例会导致死循环,必须转换为底层类型。
  3. 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))  // 返回错误信息
}

代码解释

  1. 类型定义

    type ErrNegativeSqrt float64
    

    定义一个继承自float64的新类型来保存导致错误的负数值。

  2. 错误实现

    func (e ErrNegativeSqrt) Error() string {
        return fmt.Sprintf("cannot Sqrt negative number: %v", float64(e))
    }
    

    将类型转换为float64后进行格式化,避免调用自身Error()方法造成递归。

  3. 核心逻辑

    if x < 0 {
        return 0, ErrNegativeSqrt(x)
    }
    return math.Sqrt(x), nil
    

    输入校验和处理路径分离,负数直接返回错误,正数调用标准库函数处理。

输出验证

执行后会得到以下结果:

1.4142135623730951 <nil>
0 cannot Sqrt negative number: -2

第一行正确计算了平方根,第二行返回详细的错误信息,符合题目要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值