这是我的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})+$
?
答案 0 :(得分:1)
new(TwoHandler)
正在创建struct TwoHandler
的新实例。它的所有字段都将为零。对于指针类型,这是nil
,因此除非您指定它,否则NestedTwoHandler
将是。{/ p>
new
只会将内存归零,因此如果您要初始化任何内容,则需要使用其他内容,例如composite literal:
TwoHandler: &TwoHandler{new(NestedTwoHandler)},
这将创建一个指向TwoHandler
结构的指针,其中唯一的字段设置为新的NestedTwoHandler
。请注意TwoHandler.NesterTwoHandler.NestedNestedTwoHandler
将nil
,因为我们再次使用new
,因此它仍为零值。
您可以使用文字继续初始化字段:
TwoHandler: &TwoHandler{&NestedTwoHandler{new(NestedNestedTwoHandler)}}
您可以阅读有关allocating with new。
的更多详情