验证是否在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吗?