Golang中error的一个坑

本文探讨了在Golang中,为何值为nil的error在判断时不等于nil的问题,深入解析了接口interface在其中的作用。同时,文章也提到了检查err == nil时可能存在的疑惑,并通过示例解释了在特定情况下,即使err为nil,调用其方法仍可能导致panic的原因。
摘要由CSDN通过智能技术生成

err != nil

第一个问题是:为什么值为 nil 的 error 却不等于 nil?

思考如下代码:

package main

import (
    "errors"
    "fmt"
)

type Err struct {
    err string
}

func (e *Err) Error() string {
    return e.err
}

func returnErr() *Err {
    return nil
}

func main() {
    var err error

    err = returnErr()
    fmt.Println(err, err != nil)
}

首先 returnErr() 返回了一个值为 nil 的 *Err,然后赋值给了 err,那么 fmt 会打印什么结果?是不是:

<nil> false

错,它会打印 <nil> true。当时自己也是没有头绪,学艺不精,问过大神才知道,这是接口 interface 造成的。具体可以查看 官网 FAQ

简单说,interface 被两个元素 value 和 type 所表示。只有在 value 和 type 同时为 nil 的时候,判断 interface == nil 才会为 true。而 err = returnErr() 这个过程中,虽然 value 为 nil,但 typ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值