This is my Go code. Also available at 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)
}
Its output is
{0x19583c 0x1040c128}
{}
{<nil>}
Why is NestedTwoHandler
nil
? I was expecting it to be {some_pointer_location}
with NestedNestedTwoHandler
being {}
. How can I create an empty deep nested struct using new
?
new(TwoHandler)
is creating a new instance of struct TwoHandler
. All its fields will have zero values. For a pointer type, this is nil
, so that is what NestedTwoHandler
will be unless you specify it.
new
only zeroes memory, so if you want to initialize anything, you need to use something else such as a composite literal:
TwoHandler: &TwoHandler{new(NestedTwoHandler)},
This creates a pointer to a TwoHandler
struct with the only field set to a new NestedTwoHandler
. Note that TwoHandler.NesterTwoHandler.NestedNestedTwoHandler
will be nil
as we're using new
again, so it remains the zero value.
You can keep initializing fields using literals:
TwoHandler: &TwoHandler{&NestedTwoHandler{new(NestedNestedTwoHandler)}}
You can read more details about allocating with new.