为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

隐藏零值,理解金刚在这里失败的原因我不明白如何正确地保证某件事不是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是通过反射。这真的是想要的行为吗?还是我没有看到代码中的一些重大错误?在这里播放链接
查看完整描述

2 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

让我们把接口看作一个指针。

假设你有一个指针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).

同样的情况也适用于接口(只是它们看起来有点不同。)在记忆中).

就像指针一样,指向零指针的接口本身不会是零。.

给你自己看看这是如何与指针一起工作的它是如何与接口一起工作的.


查看完整回答
反对 回复 2019-07-12
  • 2 回答
  • 0 关注
  • 419 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信