Go的面向对象编程特性

image.png
image.png

struct

类似Java中的Class,将一类事物封装为一种结构体变量。

声明结构体

image.png

  1. type People struct {
  2. name string //字段/属性/field
  3. age int
  4. sex string
  5. }
  • 在创建一个结构体变量后,如果没有给字段赋值,会有对应的默认值。
  • 如果结构体的字段类型是指针、map、slice,默认值为nil。map、slice需要make,指针需要new。
  • 不同结构体是独立的,一个独立体变量字段的更改不会影响另外一个(值类型,值拷贝)

image.png

创建结构体实例

  1. // 1.创建结构体实例
  2. //方式一
  3. var p1 People
  4. fmt.Println(p1)
  5. //方式二
  6. var p2 = People{"赵四",50,"男"}
  7. fmt.Println(p2)
  8. //方式三 : 指针
  9. var p3 = new(People)
  10. (*p3).age = 100 //标准写法
  11. p3.name = "Alice" //简化写法
  12. fmt.Println(*p3)
  13. //方式四 : 指针
  14. var p4 = &People{}
  15. (*p4).age = 40 //标准写法
  16. p4.name = "Alex" //简化写法
  17. fmt.Println(*p4)
  18. //方式五
  19. p5 := People{
  20. name:"Alex",
  21. age:20,
  22. }

使用细节

  1. 结构体的所有字段在内存中是连续的。
  2. 结构体使用户单独定义的类型,如果要和其他类型转换,需要有完全相同的字段(字段名,个数,类型)

    1. //结构体转换 :完全相同的字段(字段名,个数,类型)
    2. var a A
    3. var b B
    4. a.num = 10
    5. b.num = 20
    6. b = B(a) //强制转换
    7. fmt.Println(a,b)
  3. 结构体进行type重新定义(相当于取别名),golang认为是新的数据类型,但是相互间可以强转(不可直接转换)

image.png

  1. struct的每个字段上,可以写上一个tag,该tag可以通过反射机制获取,常见的场景是序列化与反序列化。 ```go type People struct { Name string //小写则其他包无法读取 Age int Sex string }

var p2 = People{“赵四”,50,”男”}

//序列化 jsonStr,_ := json.Marshal(p2) //序列化一个结构体,返回byte[] fmt.Println(p2 ) fmt.Println(“jsonStr”,string(jsonStr)) //jsonStr {“Name”:”赵四”,”Age”:50,”Sex”:”男”} 希望得到小写的属性名

type People struct { Name string json:"name" //json.Marshal()利用反射完成 Age int json:"age" Sex string json:"sex" } //jsonStr {“name”:”赵四”,”age”:50,”sex”:”男”} ```