Pointers 如何在运行时检查嵌套指针/访问方法是否无效
假设我有一个Go结构,看起来像这样(为了解释,请原谅语法): 现在,假设这个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
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)
}
}