Go的面向对象编程特性


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

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

创建结构体实例
// 1.创建结构体实例//方式一var p1 Peoplefmt.Println(p1)//方式二var p2 = People{"赵四",50,"男"}fmt.Println(p2)//方式三 : 指针var p3 = new(People)(*p3).age = 100 //标准写法p3.name = "Alice" //简化写法fmt.Println(*p3)//方式四 : 指针var p4 = &People{}(*p4).age = 40 //标准写法p4.name = "Alex" //简化写法fmt.Println(*p4)//方式五p5 := People{name:"Alex",age:20,}
使用细节
- 结构体的所有字段在内存中是连续的。
结构体使用户单独定义的类型,如果要和其他类型转换,需要有完全相同的字段(字段名,个数,类型)
//结构体转换 :完全相同的字段(字段名,个数,类型)var a Avar b Ba.num = 10b.num = 20b = B(a) //强制转换fmt.Println(a,b)
结构体进行type重新定义(相当于取别名),golang认为是新的数据类型,但是相互间可以强转(不可直接转换)

- 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”:”男”}
```
