我正在学习golang,当我阅读描述Structures的章节时,我遇到了不同的方法来初始化结构.
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}
,下面的代码用&符号打印,因为它是一个引用.
pointerp1 := &p3 fmt.Printf("%s", pointerp1) pointerp2 := new(passport) pointerp2.Name = "Anotherscott" fmt.Printf("%s", pointerp2)
&{ Scott Adam Some time}&{ Anotherscott }
请帮助我解决疑惑.
在用法中pointerp1 := &p3
,pointerp1
是引用变量to p3
,它保存实际数据.同样,保存数据的实际变量是pointerp2
什么?
使用这些不同类型的初始化的最佳方案是什么?
Datsik.. 49
new
为新项分配零存储或键入任何内容,然后返回指向它的指针.我不认为如果你使用new
vs短变量声明:= 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
只是短指针类型:
blah := &passport{}
blah现在是指向护照的指针
你可以在这个游乐场看到:
http://play.golang.org/p/9OuM2Kqncq
传递指针时,可以修改原始值.传递非指针时,无法修改它.那是因为go变量作为副本传递.因此,在iDontTakeAPointer
函数中,它接收到测试器结构的副本,然后修改名称字段然后返回,这对我们没有任何作用,因为它正在修改副本而不是原始文件.
new
为新项分配零存储或键入任何内容,然后返回指向它的指针.我不认为如果你使用new
vs短变量声明:= 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
只是短指针类型:
blah := &passport{}
blah现在是指向护照的指针
你可以在这个游乐场看到:
http://play.golang.org/p/9OuM2Kqncq
传递指针时,可以修改原始值.传递非指针时,无法修改它.那是因为go变量作为副本传递.因此,在iDontTakeAPointer
函数中,它接收到测试器结构的副本,然后修改名称字段然后返回,这对我们没有任何作用,因为它正在修改副本而不是原始文件.