搞搞就乱了,做个笔记总结
package mainimport "fmt"type person struct {name stringage int}/**创建 结构体变量 和 访问 结构体字段*/func init() {// 方式1 直接声明一个空结构体var p1 personfmt.Println(p1) // { 0}p1.name = "Tom"// 方式2 直接声明一个空结构体var p2 person = person{}fmt.Println(p2) // { 0}// 方式3 直接声明并初始化var p3 person = person{"Tom", 18}fmt.Println(p3) // {Tom 18}fmt.Println(p3.name) // Tom// 方式4 结构体指针 声明并初始化var p4 *person = &person{"Tom", 18}fmt.Println(p4) // &{Tom 18}/**结构体指针访问字段的标准方式应该是:(*结构体指针).字段名 (*p4).nameGo提供了 隐式解引用 特性,也支持 结构体指针.字段名 p4.name*/fmt.Println((*p4).name) // Tomfmt.Println(p4.name) // Tom 隐式解引用// 方式5 结构体指针 空结构体 方式4一样var p5 *person = new(person)fmt.Println(p5) // &{ 0}}// 结构体指针及赋值func main() {// 结构体指针p1 := &person{name: "Tom", age: 18}// 普通结构体p2 := person{name: "Jerry", age: 18}fmt.Println(p1.name, p2.name) // Tom Jerrypp1 := p1pp2 := p2fmt.Println("p1.name=", p1.name, " pp1.name=", pp1.name) // p1.name= Tom pp1.name= Tomfmt.Println("p2.name=", p2.name, " pp2.name=", pp2.name) // p2.name= Jerry pp2.name= Jerrypp1.name = "Jerry"pp2.name = "Tom"// p1, pp1 共同指向一个结构体地址 修改pp1 会同时改动p1fmt.Println("p1.name=", p1.name, " pp1.name=", pp1.name) // p1.name= Jerry pp1.name= Jerry// p2 pp2 都是普通结构体,不是指向同一个结构体地址,修改pp2 不会改p2的值fmt.Println("p2.name=", p2.name, " pp2.name=", pp2.name) // p2.name= Jerry pp2.name= Tom}
