我正在学习golang,在浏览介绍结构的章节时,我遇到了多种初始化结构的方法。
p1 := passport{} var p2 passport p3 := passport{ Photo: make([]byte, 0, 0), Name: "Scott", Surname: "Adam", DateOfBirth: "Some time", } fmt.Printf("%s\n%s\n%s\n", p1, p2, p3)
虽然这些将结构的值打印为
{ } { } { Scott Adam Some time} ,下面的代码以与号打印,因为它是参考。
{ } { } { Scott Adam Some time}
pointerp1 := &p3 fmt.Printf("%s", pointerp1) pointerp2 := new(passport) pointerp2.Name = "Anotherscott" fmt.Printf("%s", pointerp2)
&{ Scott Adam Some time}&{ Anotherscott }
如有疑问,请帮助我。
在用法中pointerp1 := &p3,pointerp1是的引用变量p3,用于保存实际数据。同样,保存数据的实际变量是pointerp2什么?
pointerp1 := &p3
pointerp1
p3
pointerp2
使用这些不同类型的初始化的最佳方案是什么?
new为新项目分配零存储或键入任何内容,然后返回指向它的指针。我不认为这是否真的很重要,如果您使用newvs短变量声明,:= type{}那基本上只是偏好
new
:= type{}
至于pointer2,pointer2变量会保存自己的数据
pointer2
// initializing a zeroed 'passport in memory' pointerp2 := new(passport) // setting the field Name to whatever pointerp2.Name = "Anotherscott"
new分配内存清零存储和返回一个指向它,所以在短,新会返回一个指针,无论你正在做,这就是为什么pointerp2回报&{ Anotherscott }
&{ Anotherscott }
您主要希望在传递需要修改的变量时使用指针(但要注意数据争用使用互斥或通道,如果您需要从不同的函数读取和写入变量)
人们使用的一种常用方法不是newdec类型的指针类型:
blah := &passport{}
等等现在是键入护照的指针
您可以在这个游乐场看到:
http://play.golang.org/p/9OuM2Kqncq
传递指针时,可以修改原始值。传递非指针时,您将无法对其进行修改。这是因为in go变量是作为副本传递的。因此,在该iDontTakeAPointer函数中,它正在接收测试程序结构的副本,然后修改名称字段,然后返回,这对我们没有任何帮助,因为它正在修改副本而不是原始副本。
iDontTakeAPointer