Go的面向对象编程特性
struct
类似Java中的Class,将一类事物封装为一种结构体变量。
声明结构体
type People struct {
name string //字段/属性/field
age int
sex string
}
- 在创建一个结构体变量后,如果没有给字段赋值,会有对应的默认值。
- 如果结构体的字段类型是指针、map、slice,默认值为nil。map、slice需要make,指针需要new。
- 不同结构体是独立的,一个独立体变量字段的更改不会影响另外一个(值类型,值拷贝)
创建结构体实例
// 1.创建结构体实例
//方式一
var p1 People
fmt.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 A
var b B
a.num = 10
b.num = 20
b = 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”:”男”}
```