验证是否在struct golang中设置了字段
我有以下结构:验证是否在struct golang中设置了字段,go,Go,我有以下结构: type Foo struct { Bar *FooBar Baz *FooBaz } type FooBar struct { Name string } type FooBaz struct { Name string } 未设置时,如何访问结构中的Baz和Bar,而不获取零指针引用 我想要像下面这样的东西,但我不断得到零指针解引用错误 if Foo.Bar == nil { throw error } 我正在努力解决这个问题 您应
type Foo struct {
Bar *FooBar
Baz *FooBaz
}
type FooBar struct {
Name string
}
type FooBaz struct {
Name string
}
未设置时,如何访问结构中的Baz
和Bar
,而不获取零指针引用
我想要像下面这样的东西,但我不断得到零指针解引用错误
if Foo.Bar == nil {
throw error
}
我正在努力解决这个问题 您应该能够与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!
请注意,如果要修改“check”函数以接受
*Foo
,并使用nil指针调用该函数,则该函数本身将因“nil指针解引用运行时错误”而死机。这可能是您的示例当前发生的情况。在尝试访问Foo结构的nil成员时,不应抛出任何错误。这是一个程序无错误退出的示例
但是,如果您想保证始终设置Bar和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)
}
将其与
nil
进行比较正是您要做的。你能举一个不适合你的例子吗?@noqcks当你在需要赋值的地方传递一个nil值时,nil指针的错误总是出现。发布代码,其中您得到了一个nil指针的错误,您确定Foo不是nil吗?