Golang中struct的各种实例化和赋值方式,一种是传值,一种是指针,让人一头雾水,所以决定梳理一下,通通通通了解.先定义一个结构体,然后结合代码进行解释。packagemainimport"fmt"typePersonstruct{NamestringAgeintDescprtionstring}instance-p以最常规的方式实例化一个struct,变量p得到一个Person结构。p:=Person{}p.Name="小明"fmt.Printf("p:%+v变量地址:%p\n",p,&p)fmt.Println("===========")//result://p:{Name:XiaomingAge:0Descprtion:}变量地址:0xc000078480//===========实例2变量p1被p赋值,因为Golang语言是按值传递的。赋值后,p1的修改不会影响p;从第一个输出可以看出,在给PHP变量赋值时,Golang的赋值并不存在像写时复制(copyonwrite)这样的情况。)机制。p1:=pfmt.Printf("p1:%+v变量地址:%p\n",p1,&p1)//没有写时复制p1.Name="小明p1"fmt.Printf("p:%+v变量地址:%p\n",p,&p)fmt.Printf("p1:%+v变量地址:%p\n",p1,&p1)fmt.Println("===========")//result://p1:{Name:XiaomingAge:0Descprtion:}变量地址:0xc0000784e0//p:{Name:XiaomingAge:0Descprtion:}变量地址:0xc000078480//p1:{Name:Xiaomingp1Age:0Descprtion:}Variableaddress:0xc0000784e0//===========实例3通过取地址符将p的地址赋值给p2,变量p2为指针,它存储了p的地址。当p2修改结构体中的元素Name时,通过p访问该结构体对应的值也随之改变。p2:=&p//等同于varp2*Person=&pfmt.Printf("p2:%+v指针变量指向地址(变量值):%p变量地址:%p\n",p2,p2,&p2)p2.Name="小明p2"fmt.Printf("p1:%+v变量地址:%p\n",p,&p)fmt.Printf("p2:%+v指针变量指向地址(变量值):%p变量地址:%p\n",p2,p2,&p2)fmt.Println("===========")//result://p2:&{Name:XiaomingAge:0Descprtion:}指针变量指向地址(变量值):0xc000078480变量地址:0xc000006030//p1:{Name:Xiaomingp2Age:0Descprtion:}变量地址:0xc000078480//p2:&{Name:Xiaomingp2Age:0Descprtion:}指针变量指向地址(变量值):0xc000078480变量地址:0xc000006030//===========从new(Person)获取实例四变量p3。new会开辟一块内存,并将内存地址返回给p3,即p3是指向这块内存的指针。p3是一个指向结构体的指针,它有两种操作结构体的方法,p3.Age=3和*p3=Person{Name:"Xiaomingp3"},如果后面操作第二种方法,会覆盖第一种修改以各种方式对结构进行处理。由于p3是一个指针,当p3赋值给p5时,p5也会指向这个内存地址。p3:=new(Person)fmt.Printf("p3:%+v指针变量指向地址(变量值):%p变量地址:%p\n",p3,p3,&p3)p3.Age=3//等同于(*p3).Age=3fmt.Println("=================操作年龄================")fmt.Printf("p3:%+v指针变量指向地址(变量值):%p变量地址:%p\n",p3,p3,&p3)*p3=Person{姓名:"小明p3",}fmt.Println("================操作名==========================================================")fmt.Printf("p3:%+v指针变量指向地址(变量值):%p变量地址:%p\n",p3,p3,&p3)p5:=p3fmt.Println("================p5:=p3================")fmt.Printf("p3:%+v指针变量指向地址(变量值):%p变量地址:%p\n",p3,p3,&p3)fmt.Printf("p5:%+v指针变量指向地址(变量值):%p变量地址:%p\n",p5,p5,&p5)p3.Name="小明p3修改"fmt.Println("================p3修改================")fmt.Printf("p3:%+v指针变量指向地址(变量值):%p变量地址:%p\n",p3,p3,&p3)fmt.Printf("p5:%+v指针变量指向地址(变量值):%p变量地址:%p\n",p5,p5,&p5)fmt.Println("===========")//result://p3:&{Name:Age:0Descprtion:}指针变量指向地址(变量值):0xc000078630变量地址:0xc000006038//================OperationAge================//p3:&{Name:Age:3Descprtion:}指针变量指向地址(变量值):0xc000078630变量地址:0xc000006038//=================操作名================//p3:&{Name:Xiaomingp3Age:0Descprtion:}指针变量指向地址(变量值):0xc000078630变量地址:0xc000006038//=================p5:=p3================//p5:&{Name:Xiaomingp3Age:0Descprtion:}指针变量指向地址(变量值):0xc000078630变量地址:0xc000006040//================p3修改=================//p3:&{Name:Xiaomingp3modificationAge:0Descprtion:}指针变量指向地址(变量值):0xc000078630变量地址:0xc000006038//p5:&{Name:Xiaomingp3modifyAge:0Descprtion:}指针变量指向地址(变量值):0xc000078630变量地址:0xc000006040//===========例5p4的实例化方法也会得到一个指针。这种实例化方式和p3的实例化方式一样,只是p4的写法更常用p4:=&Person{Name:"Xiaomingp4",}fmt.Printf("%+v%p\n",p4,&p4)//result://&{Name:Xiaomingp4Age:0Descprtion:}0xc000006048附完整代码:packagemainimport"fmt"typePersonstruct{NamestringAgeintDescprtionstring}funcmain(){p:=Person{}p.Name="XiaoMing"fmt.Printf("p:%+vvariable地址:%p\n",p,&p)fmt.Println("============")p1:=pfmt.Printf("p1:%+v变量地址:%p\n",p1,&p1)//不存在写时复制p1.Name="小明p1"fmt.Printf("p:%+v变量地址:%p\n",p,&p)fmt.Printf("p1:%+v变量地址:%p\n",p1,&p1)fmt.Println("===========")p2:=&pfmt.Printf("p2:%+vpointer变量指向地址(变量值):%p变量地址:%p\n",p2,p2,&p2)p2.Name="小明p2"fmt.Printf("p1:%+v变量地址:%p\n",p,&p)fmt.Printf("p2:%+v指针变量指向地址(变量值):%p变量地址:%p\n",p2,p2,&p2)fmt.Println("============")p3:=new(Person)fmt.Printf("p3:%+v指针变量iablepointingaddress(variablevalue):%pvariableaddress:%p\n",p3,p3,&p3)p3.Age=3//同(*p3).Age=3fmt.Println("================OperationAge================")fmt.Printf("p3:%+v指针变量指向地址(变量值):%p变量地址:%p\n",p3,p3,&p3)*p3=Person{Name:"小明p3",}fmt.Println("=================操作名称================")fmt.Printf("p3:%+v指针变量指向地址(变量值):%p变量地址:%p\n",p3,p3,&p3)p5:=p3fmt.Println("================p5:=p3================")fmt.printf("p3:%+v指针变量指向地址(变量值):%p变量地址:%p\n",p3,p3,&p3)fmt.Printf("p5:%+v指针变量指向地址(变量value):%p变量地址:%p\n",p5,p5,&p5)p3.Name="小明修改p3"fmt.Println("================p3修改=================")fmt.Printf("p3:%+v指针变量指向地址(变量值):%p变量地址:%p\n",p3,p3,&p3)fmt.Printf("p5:%+v指针变量指向地址(变量值):%p变量地址:%p\n",p5,p5,&p5)fmt.Println("===========")p4:=&Person{Name:"小明p4",}fmt.Printf("%+v%p\n",p4,&p4)}结束!
