初始化一个结构体的时候可以使用new或者{}T来进行。
用下面3个结构体来测试
type Nil1 struct {
}
type Nil2 struct {
}
type Nil3 struct {
Id1 int
Id2 int
}
func main(){
var t11 = Nil1{}
var t12 = new(Nil1)
var t13 = &Nil1{}
var t21 = Nil2{}
var t22 = new(Nil2)
var t23 = &Nil2{}
var t31 = Nil3{}
var t32 = new(Nil3)
var t33 = &Nil3{}
fmt.Printf("%v,%p,%v ", t11, &t11, unsafe.Sizeof(t11))
fmt.Printf("%v,%p,%v ", t12, &t12, unsafe.Sizeof(t12))
fmt.Printf("%v,%p,%v \n", t13, &t13, unsafe.Sizeof(t13))
fmt.Printf("%v,%p,%v ", t21, &t21, unsafe.Sizeof(t21))
fmt.Printf("%v,%p,%v ", t22, &t22, unsafe.Sizeof(t22))
fmt.Printf("%v,%p,%v \n", t23, &t23, unsafe.Sizeof(t23))
fmt.Printf("%v,%p,%v ", t31, &t31, unsafe.Sizeof(t31))
fmt.Printf("%v,%p,%v ", t32, &t32, unsafe.Sizeof(t32))
fmt.Printf("%v,%p,%v \n", t33, &t33, unsafe.Sizeof(t33))
}
输出结果如下
{},0x2cd5f8,0 &{},0xc000006028,8 &{},0xc000006030,8
{},0x2cd5f8,0 &{},0xc000006038,8 &{},0xc000006040,8
{0 0},0xc00000a0a0,16 &{0 0},0xc000006048,8 &{0 0},0xc000006050,8
- 对空结构体
用{}T 来初始化,他们的地址会指向同一个,同时并不占用空间。 而&{}T和new等价,他们初始化T类型的零值,并返回了指向该内存的指针,每次操作都会开辟一个新的内存空间。
- 对非空结构体
用{}T 来初始化时,该结构体中每一个变量的类型的内存占用进行分配。同时返回了T类型。每次返回的对象的指向并不相同。 而&{}T和new等价,他们初始化T类型的零值,并返回了指向该内存的指针,每次操作都会开辟一个新的内存空间。