• make 只适用于3种内建的引用类型:切片、map 和 channel。make(T) 返回一个类型为 T 的初始值,不是指针

  • new(T) 返回类型为*T; 即new(某个结构体),得到的结果是该结构体的指针; new 适用于值类型,如数组和结构体;new(T)相当于&T{}

new一般不常用,而用&T{}代替


小问题: 如下输出为true还是false?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import "fmt"

func main() {

type LogParamter struct {
//name string
}

p1 := LogParamter{}
p2 := &LogParamter{}
p3 := new(LogParamter)

fmt.Println(p1)
fmt.Printf("%p\n", p2)
fmt.Printf("%p\n", p3)

fmt.Println(p2 == p3)

}

LogParamter为空结构体时,输出为:

1
2
3
4
{}
0x1196a78
0x1196a78
true

LogParamter

1
2
3
type LogParamter struct {
name string
}

时,输出为:

1
2
3
4
{}
0xc0000661e0
0xc0000661f0
false

如果不比较指针而直接比较值, 若LogParamter中某个字段的类型不能判等,即如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main

import "fmt"

func main() {

type LogParamter struct {
//name string
info map[string]string
}

p1 := LogParamter{}

// p2 := &LogParamter{}
// p3 := new(LogParamter)

// fmt.Println(p1)
// fmt.Printf("%p\n", p2)
// fmt.Printf("%p\n", p3)
// fmt.Println(p2 == p3)


p4 := LogParamter{}
fmt.Println(p1 == p4) //Invalid operation: p1 == p4 (operator == not defined on LogParamter)

}

则直接编译不通过


只有在结构体的所有字段类型全部支持判等时,才可做(值)判断操作