指向接口(interface)的指针不为空

标签 go interface

<分区>

有人可以对此代码行为提供一些解释吗: https://play.golang.org/p/_TjQhthHl3

package main

import (
    "fmt"
)

type MyError struct{}
func (e *MyError) Error() string {
    return "some error"
}

func main() {
    var err error
    if err == nil {
        fmt.Println("[OK] err is nil ...")
    }else{
        fmt.Println("[KO] err is NOT nil...")
    }
    isNil(err)


    var err2 *MyError
    if err2 == nil {
        fmt.Println("[OK] err2 is nil ...")
    }else{
        fmt.Println("[KO] err2 is NOT nil...")
    }
    isNil(err2)
}

func isNil(err error){
    if err == nil {
        fmt.Println("[OK] ... still nil")
    }else{
        fmt.Println("[KO] .. why not nil?")
    }
}

输出是:

[OK] err is nil ...
[OK] ... still nil
[OK] err2 is nil ...
[KO] .. why err2 not nil?

我找到了这篇文章 Check for nil and nil interface in Go但我还是不明白...

最佳答案

error 是一个内置接口(interface),*MyError 实现了该接口(interface)。即使 err2 的值为 nil,当您将它传递给 isNil 时,该函数会获得一个非 nil 接口(interface)值。该值包含有关类型的信息 (*MyError) 和值本身,它是一个 nil 指针。

如果您尝试在 isNil 中打印 err,您将看到在第二种情况下,即使 err2 也会出现“一些错误” > 为零。这说明了为什么 err 在那种情况下不是 nil(它必须包含类型信息)。

关于指向接口(interface)的指针不为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44531857/

相关文章:

golang 同步/原子包?

Go,%v 格式为嵌套结构调用 String()

go - 如何在 if-else 中初始化错误类型

Java - 将字符串映射到带有枚举的接口(interface)的实现?

java - 接口(interface)和 foreach 循环有问题

url - Golang 提供主页并提供模板页面

go - gRPC 服务器无故停止

delphi - 调用从接口(interface)和另一个祖先继承的类的方法

python - 将 gui 中的函数分离到进程中。滞后

java - 使用接口(interface)而不是类