我具有以下结构:
type Foo struct {
Bar *FooBar
Baz *FooBaz
}
type FooBar struct {
Name string
}
type FooBaz struct {
Name string
}
如何在未设置n {{}}和Baz
的情况下访问结构中的Bar
和if Foo.Bar == nil {
throw error
}
?
我想要类似下面的内容,但是我一直收到零指针取消引用错误。
if something then
while somethingElse do
-- some code
end
end
我为此感到挣扎!
答案 0 :(得分:0)
您应该可以将其与nil进行比较,这是一个有效的示例:
check := func(f Foo) {
if f.Bar == nil {
panic("oops!")
}
fmt.Println("OK")
}
foo1 := Foo{Bar: &FooBar{"Alpha"}}
check(foo1) // OK
foo2 := Foo{}
check(foo2) // panic: oops!
请注意,如果要修改“检查”函数以接受*Foo
,并且使用nil指针调用该函数,则该函数本身将因“ nil指针取消引用运行时错误”而感到恐慌。这可能就是您的示例当前正在发生的情况。
答案 1 :(得分:0)
尝试访问Foo结构的nil成员时,不应出现任何错误。这是playground example,程序无错误退出。
但是,如果您想确保始终设置Bar and Baz,我建议您创建一个函数来构建Foo结构,并使Bar和Biz成员小写,以免外部软件包可见:
package main
import (
"fmt"
)
type Foo struct {
bar *FooBar
baz *FooBaz
}
type FooBar struct {
Name string
}
type FooBaz struct {
Name string
}
func NewFoo(bar *FooBar, baz *FooBaz) *Foo {
r := &Foo {bar, baz}
if bar == nil {
r.bar = &FooBar{"default bar"}
}
if baz == nil {
r.baz = &FooBaz{"default baz"}
}
return r
}
func main() {
f := NewFoo(nil, nil)
// prints: f.Bar: default bar
fmt.Printf("f.Bar: %v", f.bar.Name)
}