搞搞就乱了,做个笔记总结

    1. package main
    2. import "fmt"
    3. type person struct {
    4. name string
    5. age int
    6. }
    7. /**
    8. 创建 结构体变量 和 访问 结构体字段
    9. */
    10. func init() {
    11. // 方式1 直接声明一个空结构体
    12. var p1 person
    13. fmt.Println(p1) // { 0}
    14. p1.name = "Tom"
    15. // 方式2 直接声明一个空结构体
    16. var p2 person = person{}
    17. fmt.Println(p2) // { 0}
    18. // 方式3 直接声明并初始化
    19. var p3 person = person{"Tom", 18}
    20. fmt.Println(p3) // {Tom 18}
    21. fmt.Println(p3.name) // Tom
    22. // 方式4 结构体指针 声明并初始化
    23. var p4 *person = &person{"Tom", 18}
    24. fmt.Println(p4) // &{Tom 18}
    25. /**
    26. 结构体指针访问字段的标准方式应该是:(*结构体指针).字段名 (*p4).name
    27. Go提供了 隐式解引用 特性,也支持 结构体指针.字段名 p4.name
    28. */
    29. fmt.Println((*p4).name) // Tom
    30. fmt.Println(p4.name) // Tom 隐式解引用
    31. // 方式5 结构体指针 空结构体 方式4一样
    32. var p5 *person = new(person)
    33. fmt.Println(p5) // &{ 0}
    34. }
    35. // 结构体指针及赋值
    36. func main() {
    37. // 结构体指针
    38. p1 := &person{name: "Tom", age: 18}
    39. // 普通结构体
    40. p2 := person{name: "Jerry", age: 18}
    41. fmt.Println(p1.name, p2.name) // Tom Jerry
    42. pp1 := p1
    43. pp2 := p2
    44. fmt.Println("p1.name=", p1.name, " pp1.name=", pp1.name) // p1.name= Tom pp1.name= Tom
    45. fmt.Println("p2.name=", p2.name, " pp2.name=", pp2.name) // p2.name= Jerry pp2.name= Jerry
    46. pp1.name = "Jerry"
    47. pp2.name = "Tom"
    48. // p1, pp1 共同指向一个结构体地址 修改pp1 会同时改动p1
    49. fmt.Println("p1.name=", p1.name, " pp1.name=", pp1.name) // p1.name= Jerry pp1.name= Jerry
    50. // p2 pp2 都是普通结构体,不是指向同一个结构体地址,修改pp2 不会改p2的值
    51. fmt.Println("p2.name=", p2.name, " pp2.name=", pp2.name) // p2.name= Jerry pp2.name= Tom
    52. }