如何将 nil 接口转换为 nil 其他接口

cru*_*nk1 2 go downcast type-assertion go-interface

我有一个经典的 Go nil 接口问题。

我试图断言 an interface{},我从 a 分配nil error回一个error接口。这句话很令人困惑,所以我有一个方便的例子: https: //play.golang.com/p/Qhv7197oIE_z

package main

import (
    "fmt"
)

func preferredWay(i interface{}) error {
    return i.(error)
}

func workAround(i interface{}) error {
    if i == nil {
        return nil
    }
    return i.(error)
}

func main() {
    var nilErr error
    fmt.Println(workAround(nilErr))    // Prints "<nil>" as expected.
    fmt.Println(preferredWay(nilErr))  // Panics.
}
Run Code Online (Sandbox Code Playgroud)

输出:

<nil>
panic: interface conversion: interface is nil, not error

goroutine 1 [running]:
main.preferredWay(...)
    /tmp/sandbox415300914/prog.go:8
main.main()
    /tmp/sandbox415300914/prog.go:21 +0xa0
Run Code Online (Sandbox Code Playgroud)

换句话说,我正在尝试从 anil interface{}向下转换为 anil error接口。如果我知道一开始就interface{}被分配为 a ,有没有一种优雅的方法可以做到这一点?nil error

仅供参考,如果这看起来不寻常,那是因为我正在实施一些模拟测试。

Bur*_*dar 6

这有效吗?

func preferredWay(i interface{}) error {
    k, _ := i.(error)
    return k
}
Run Code Online (Sandbox Code Playgroud)

  • 接口有一对引用,即对类型的引用和对值的引用。如果接口本身为零,那么这些都为零。如果接口指向nil值,则类型为非nil(它指向nil值的类型),但值是nil。如果接口是第一类,则类型断言会失败,因为类型为 nil。如果接口是第二种,类型断言会起作用,因为存在非零类型。 (4认同)
  • @ScottCrunkleton这与值是“nil”的事实关系不大,问题是“nil”是*无类型的*,即存储在“i”中的“非值”的类型不是“接口” {}`, 不是任何东西,因此 `i.(interface{})` 失败,如果没有 `, ok` 它会出现恐慌。尝试给“i”一个*类型化的*“nil”,然后将“i”断言为该类型,它仍然会恐慌吗?不,没有。https://play.golang.com/p/_xFk0jX5YIW (2认同)