golang的new和make主要区别如下: 1、make只能用来分配及初始化类型为slice,map,chan的数据;new可以分配任意类型的数据 2、new分配返回的是指针,即类型*T;make返回引用,即T; 3、new分配的空间被清零,make分配后,会进行初始化。effective go举了一个例子,见:http://golang.org/doc/effective_go.html#allocation_make 对于struct的分配和初始化,除了可以使用new外,还可以这样做: T {},例如 ``` func TestAlloc(t *testing.T) { type T struct { n string i int f float64 fd *os.File b []byte s bool } var t1 *T t1 = new(T) fmt.Println(t1) t2 := T{} fmt.Println(t2) t3 := T{"hello", 1, 3.1415926, nil, make([]byte, 2), true} fmt.Println(t3) } ``` 值得注意的是,如果使用T{}的方式初始化变量的话: #### 1、**与C语言不同,T{}分配的局部变量是可以返回的,且返回后该空间不会释放**,例如 ``` import "fmt" type T struct { i, j int } func a(i, j int) T { i := T { i, j} return i } func b { t = a(1, 2) fmt.Println(t) } ``` 2、一个语法问题 使用T{}来初始化时,符号}不能单独占一行,否则会报错,如下: ***** ***** ***** new() 这是一个用来分配内存的内置函数,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配的 t 类型的零值的指针。 在golang的代码定义如下: func new(t Type) *Type 1 strut{} 直接使用struct{} 来初始化strut时,返回的是一个struct类型的值,而不是指针两者是不一样的 两者对比代码如下: ``` type Student struct{ id int name string } func main(){ var s_1 *Student = new(Student) s_1.id = 100 s_1.name = "cat" var s_2 Student = Student{id:1,name:"tom"} fmt.Println(s_1,s_2) } ``` ``` 输出结果: &{100 cat} {1 tom} ``` 从上面代码的声明和打印的结果中就可以看出 s_1 的类型为指针,s_2 为一个Student类型