golang nil、error 与interface 总结

没有检索到摘要

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

interface{} 与nil

golang 的interface{}大体可以描述为两个元素(type+data),只有当type和data都为nil的时候
interface才会与nil相等。

var v *T
var i interface{}
i = v

v 为空指针,所以必定等于nil
interface{},type和data都是nil,所以也为nil
但是 i=v后,i的type不为nil了,所以此时不为nil

    var a interface{}
    fmt.Println(a == nil) //true
    a = "1" //data="1" type=string
    fmt.Println(a == nil) //false
    var b *int
    a = b //data=nil type=int
    fmt.Println(a == nil) //false
    fmt.Println(b == nil) //true
    fmt.Println(b == a) //true

为什么a、b与nil之间的等价不具有传递性。
1. b==nil是正确的,在a=b的时候做了个封箱的操作,在a==b的时候做了拆箱的操作
2. golang在type和interface之间的转换不明显,容易让人误解。

error

error 其实就是一种特殊的interface{}

type error interface {
    Error() string
}

example:

package main

import (
    "fmt"
)

type MyError struct {
    errCode uint8
}
func (e *MyError) Error() string {
    switch e.errCode {
    case 1:
        return "file not found"
    case 2:
        return "time out"
    case 3:
        return "permission denied"
    default:
        return "unknown error"
    }
}

// 相当于使用interface进行封箱操作
func GetError1() error {
    var err *MyError = nil
    return err
}

// 没有使用interface进行封箱操作
func GetError2() *MyError {
    var err *MyError = nil
    return err
}

func main() {
    ret1 := GetError1() //封箱,所以不为nil
    fmt.Println(ret1 == nil) //false
    e, _ := ret1.(*MyError) //显式拆箱,所以为nil
    fmt.Println(e == nil) //true

    ret2 := GetError2() // 不用转换,所以为nil
    fmt.Println(ret2 == nil) //true
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值