这是我的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)}}
您可以阅读有关分配新的详细信息。