golang 空结构体

原创
2021/03/12 16:24
阅读数 314

golang 空结构体

初始化一个结构体的时候可以使用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类型的零值,并返回了指向该内存的指针,每次操作都会开辟一个新的内存空间。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部