验证是否在struct golang

时间:2018-08-01 21:27:10

标签: go

我具有以下结构:

type Foo struct {
    Bar *FooBar
    Baz *FooBaz
}

type FooBar struct {
    Name string
}

type FooBaz struct {
    Name string
}

如何在未设置n {{}}和Baz的情况下访问结构中的Barif Foo.Bar == nil { throw error }

我想要类似下面的内容,但是我一直收到零指针取消引用错误。

if something then
    while somethingElse do
        -- some code
    end
end

我为此感到挣扎!

2 个答案:

答案 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)
}