Pointers 如何在运行时检查嵌套指针/访问方法是否无效

Pointers 如何在运行时检查嵌套指针/访问方法是否无效,pointers,go,Pointers,Go,假设我有一个Go结构,看起来像这样(为了解释,请原谅语法): 现在,假设这个Foo结构存储在进程的内存中,填充MyBar字段需要一些时间。与中一样,它在一段时间内为nil。是否有任何方法可以在运行时检查其是否保存以访问Bark()方法,而无需手动执行nil检查 例如,类似于: // Early on, this happens: f := &Foo{} . . . . // And later, I wanna see if its safe to do: if isSafe(b.MyB

假设我有一个Go结构,看起来像这样(为了解释,请原谅语法):

现在,假设这个
Foo
结构存储在进程的内存中,填充
MyBar
字段需要一些时间。与中一样,它在一段时间内为
nil
。是否有任何方法可以在运行时检查其是否保存以访问
Bark()
方法,而无需手动执行
nil
检查

例如,类似于:

// Early on, this happens:
f := &Foo{}
.
.
.
.
// And later, I wanna see if its safe to do:
if isSafe(b.MyBar) {
   b.MyBar.Bar()
}

我问这个问题的原因是为了深入嵌套指针,这可能会变得非常痛苦。有什么想法吗?

深入检查结构是否有零指针没有捷径。您的
isSafe
本质上是一张零支票:

if b.MyBar!=nil {
  b.MyBar.Bark()
}
或者,您也可以在方法中检查nil接收器:

func (b* Bar) Bark() {
    if b!=nil {
       fmt.Printf("Hello I'm a bar with value: %v", b.value)
    }
}

不过,最后一次使用可能会隐藏程序中的错误,因为即使接收器不应该为零,它也会运行而不会惊慌失措。

如果安全性的衡量标准是值是否为
nil
,那么安全检查就是
nil
检查。“Foo struct存储在进程的内存中,填充MyBar字段需要一段时间”-这是否意味着它正在同时更新(goroutine)?如果是这样,情况会更复杂,您不应该假设指针更新是原子的(请参阅)
func (b* Bar) Bark() {
    if b!=nil {
       fmt.Printf("Hello I'm a bar with value: %v", b.value)
    }
}