3 回答
TA贡献1852条经验 获得超7个赞
new为新项目或类型分配零存储,然后返回指向它的指针。我认为是否使用newvs 短变量声明并不重要,:= type{}这主要是偏好
至于pointer2,pointer2变量保存自己的数据,当你这样做
// initializing a zeroed 'passport in memory'
pointerp2 := new(passport)
// setting the field Name to whatever
pointerp2.Name = "Anotherscott"
new在内存中分配归零存储并返回一个指向它的指针,所以简而言之, new 将返回一个指向您正在制作的任何内容的指针,这就是为什么pointerp2返回&{ Anotherscott }
当您传递需要修改的变量时,您主要想使用指针(但请注意数据竞争,如果您需要从不同的函数读取和写入变量,请使用互斥锁或通道)
人们使用的一种常用方法new是 short dec 一个指针类型:
blah := &passport{}
blah 现在是指向类型护照的指针
你可以在这个游乐场看到:
http://play.golang.org/p/9OuM2Kqncq
传递指针时,可以修改原始值。传递非指针时,您无法修改它。那是因为在 go 中变量是作为副本传递的。因此,在iDontTakeAPointer函数中,它接收 tester 结构的副本,然后修改 name 字段,然后返回,这对我们没有任何作用,因为它正在修改副本而不是原始内容。
TA贡献1765条经验 获得超5个赞
还存在保存数据的变量。您可以使用 取消引用指针
*pointerp2
,甚至将其分配给变量 (p2 := pointerp2
),但该变量将是数据的副本。也就是说,修改一个不再影响另一个(http://play.golang.org/p/9yRYbyvG8q)。new
往往不太受欢迎,尤其是在结构方面。可以在https://softwareengineering.stackexchange.com/a/216582上找到有关其目的(提示:首先出现)和用例的详细讨论。
编辑:此外,p1
并不是真正不同类型的初始化p3
,而是将值初始化为它们的零值(""
for string
,nil
for []byte
),而不是将值分配给任何类型的字段。任何省略的字段都会发生同样的情况:
p4 := passport{
Name: "Scott",
Surname: "Adam",
}
在这种情况下,p4.Photo和p4.DateOfBirth仍然是零值(nil和"")。这种passport{}情况只是所有字段都被省略的情况。
- 3 回答
- 0 关注
- 226 浏览
添加回答
举报