使用new初始化嵌套结构

时间:2018-01-25 11:01:08

标签: go struct new-operator

这是我的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?我期待{some_pointer_location} NestedNestedTwoHandler{} new。如何使用^[a-zA-Z0-9]+([\w\.\'\!\#\$\%\&\*\+\-\/\=\?\^\`\{\|\}\~])+([a-zA-Z0-9])+@(([a-zA-Z0-9\.\-])+.)+([a-zA-Z0-9]{2,8})+$

创建一个空的深层嵌套结构

1 个答案:

答案 0 :(得分:1)

new(TwoHandler)正在创建struct TwoHandler的新实例。它的所有字段都将为零。对于指针类型,这是nil,因此除非您指定它,否则NestedTwoHandler将是。{/ p>

new只会将内存归零,因此如果您要初始化任何内容,则需要使用其他内容,例如composite literal

    TwoHandler: &TwoHandler{new(NestedTwoHandler)},

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

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

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

您可以阅读有关allocating with new

的更多详情