(* T)(nil)和&T {} / new(T)有什么区别? Golang

Could anybody explain what the subtle difference between these two notations: (*T)(nil)/new(T) and &T{}.

type Struct struct {
    Field int
}

func main() {
    test1 := &Struct{}
    test2 := new(Struct)
    test3 := (*Struct)(nil)
    fmt.Printf("%#v, %#v, %#v 
", test1, test2, test3)
    //&main.Struct{Field:0}, &main.Struct{Field:0}, (*main.Struct)(nil) 
}

Seems like the only difference of this one (*T)(nil) from other is that it returns nil pointer or no pointer, but still allocates memory for all fields of the Struct.

The two forms new(T) and &T{} are completely equivalent: Both allocate a zero T and return a pointer to this allocated memory. The only difference is, that &T{} doesn't work for builtin types like int; you can only do new(int).

The form (*T)(nil) does not allocate a T it just returns a nil pointer to T. Your test3 := (*Struct)(nil) is just a obfuscated variant of the idiomatic var test3 *Struct.