注:
- 结构体就是对象
- 结构体是一种复合的基本类型,结构体和基本类型使用方式一模一样!
- 初始化可以省略变量名,但必须全部、有序!
关键字type
type
关键字用于自定义一种数据类型,eg:
type myInt int /myInt就是自定义的一种数据类型
type 类型民 struct{ /这个结构体也就是自定义的一种数据类型
字段名1 T1
字段名2 T2
...
}
定义结构体
type 类型民 struct{
字段名1 T1
字段名2 T2
...
}
举例:(字段tags可有可无)
注:修改一下
实例化结构体:和基本类型一样
一、普通实例化
var user User
user.Id = 1
user.Name = "Leslie"
二、初始化实例化
最广泛的是取地址实例化:
user := &User{
Id: 2,
Name: "Json",
}
三、直接创建结构体指针
ins
为对象指针!【且Go对struct优化使用了语法糖(将 ins.Id
转换为了(*ins).Id
),指针可以和变量名一样使用!】
ins := new(User)
ins.Id = 2022
四、构造函数创建
传递的是指针:
匿名结构体
实例化
普通实例化
var ss struct{
id int
name string
}
初始化实例化
常常采用指针:
sss := &struct {
id int
name string
}{
id:1,
}
面向对象特性实现
一、方法:特定类型的函数
要明确:
- Go中的函数就相当于Java工具类方法: 开放函数都直接使用(内建函数),或通过包名调用!
- 而方法就是给特定类型变量使用的特殊函数!【Java中对象的方法】
- 特定类型变量:任何类型都可以
- 在方法中这种特定类型变量叫接收器
- 接收器可以是指针、也可以不是!【回想指针、非指针的区别】
给对象(特定变量)声明它的方法
调用:接收器.方法名()
func (接收器变量 接收器类型) 方法名(参数列表)(返回值列表){
...
}
同样Java,只能由该对象调用,不能被直接或其他对象调用:
type User struct {
Id int
Name,Birthday string
}
func (u *User) getId() int {
return u.Id
}
二、继承:匿名结构体内嵌
【注意:不管多少层都一样,但得保证字段名不重复】
【注:初始化时把类型看作类型名使用(其实它们的名字就是它们的类型)】
三、实现接口,接口的多态特性!
结构体 <=(指针)=> JSON
注:参数传递都是指针! 【结构体的属性必须对外开放(首字母大写)才能被json包解析!】
序列化:Marshal(v interface{})
json
包中的Marshal(v interface{}) ([]byte, error)
方法!
p := NewPhone(10,52.5,"red")
// 将结构体序列化成json数据流
data,err := json.Marshal(p)
fmt.Println(string(data),err)
反序列化:Unmarshal(data []byte, v interface{})
json
包中的Unmarshal(data []byte, v interface{}) error
pp := new(Phone)
// 将json数据流解析成结构体
json.Unmarshal(data,pp)
fmt.Printf("%+v",pp)