2015-01-07 81 views
4

有人可以解释这两个符号之间的细微差别:(*T)(nil)/new(T)&T{}(* T)(nil)和&T {}/new(T)之间的区别是什么? Golang

type Struct struct { 
    Field int 
} 

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

好像这一个(*T)(nil)从其他的唯一区别是,它返回零指针或没有指针,但仍分配内存,该结构的各个领域。

回答

10

new(T)&T{}这两种形式是完全等价的:都分配一个零T并返回一个指向这个分配的内存的指针。唯一的区别是,&T{}不适用于内置类型,如int;你只能做new(int)

形式(*T)(nil)分配T它只是返回一个零指针T.你test3 := (*Struct)(nil)是惯用var test3 *Struct的只是一个模糊的变种。

+0

如果'(* T)(nil)'没有分配内存,为什么我可以访问它的Struct的字段? 'unsafe'显示的值与我刚使用新(T) –

+6

的值相同。您无权访问。 – Volker

+0

是的,你是对的!这是autocompletion)对不起,我noob的问题,但如果是这样,为什么空指针仍然需要字节? –

相关问题