使用 new 初始化嵌套结构



这是我的Go代码。也可在Go Playground获得

package main
import "fmt"
type App struct {
    OneHandler *OneHandler
    TwoHandler *TwoHandler
}
type OneHandler struct {
}
type TwoHandler struct {
    NestedTwoHandler *NestedTwoHandler
}
type NestedTwoHandler struct {
    NestedNestedTwoHandler *NestedNestedTwoHandler
}
type NestedNestedTwoHandler struct {
}
func main() {
    app := &App{
        OneHandler: new(OneHandler),
        TwoHandler: new(TwoHandler),
    }
    fmt.Println(*app)
    fmt.Println(*app.OneHandler)
    fmt.Println(*app.TwoHandler)
}

它的输出是

{0x19583c 0x1040c128}
{}
{<nil>}

为什么NestedTwoHandler nil?我期待它与NestedNestedTwoHandler {} {some_pointer_location}.如何使用new创建一个空的深度嵌套结构?

new(TwoHandler)正在创建一个结构TwoHandler的新实例。其所有字段的值均为零。对于指针类型,这是 nil ,因此除非您指定它,否则NestedTwoHandler就是这样。

new只将内存归零,所以如果你想初始化任何东西,你需要使用其他的东西,比如复合文字:

    TwoHandler: &TwoHandler{new(NestedTwoHandler)},

这将创建一个指向 TwoHandler 结构的指针,其中唯一的字段设置为新NestedTwoHandler。请注意,当我们再次使用 new 时,TwoHandler.NesterTwoHandler.NestedNestedTwoHandler将被nil,因此它仍然是零值。

您可以使用文本继续初始化字段:

    TwoHandler: &TwoHandler{&NestedTwoHandler{new(NestedNestedTwoHandler)}}

您可以阅读有关分配新的详细信息。

最新更新