隐藏零值,理解金刚在这里失败的原因

隐藏零值,理解金刚在这里失败的原因

我不明白如何正确地保证某件事不是nil在这种情况下:

package main

type shower interface {
  getWater() []shower}type display struct {
  SubDisplay *display}func (d display) getWater() []shower {
  return []shower{display{}, d.SubDisplay}}func main() {
  // SubDisplay will be initialized with null
  s := display{}
  // water := []shower{nil}
  water := s.getWater()
  for _, x := range water {
    if x == nil {
      panic("everything ok, nil found")
    }

    //first iteration display{} is not nil and will
    //therefore work, on the second iteration
    //x is nil, and getWater panics.
    x.getWater()
  }}

我找到的唯一方法是检查这个值是否真的nil是通过反射。

这真的是想要的行为吗?还是我没有看到代码中的一些重大错误?

在这里播放链接


慕运维8079593
浏览 420回答 2
2回答

慕莱坞森

让我们把接口看作一个指针。假设你有一个指针a这是零,指的是什么都没有。var a *int // nil那么你就有了一个指针b它指向a.var b **intb = &a // not nil看看发生了什么?b指向无意义的指针。所以即使是链尾的零指针,b指的是什么-不是零。如果您查看进程的内存,它可能如下所示:address | name | value1000000 | a    | 02000000 | b    | 1000000看见?a指向地址0(这意味着nil),以及b的地址a (1000000).同样的情况也适用于接口(只是它们看起来有点不同。)在记忆中).就像指针一样,指向零指针的接口本身不会是零。.给你自己看看这是如何与指针一起工作的和它是如何与接口一起工作的.
打开App,查看更多内容
随时随地看视频慕课网APP