封装
隐藏对象的属性和实现细节,仅对外公开可控成员方法。主要通过结构体和方法访问可见性进行封装
继承
子类继承父类的所有特征和行为。主要通过结构体组合实现继承的效果
多态
同一类对象表现出不一样的具体实现。主要通过结构体实现接口,通过接口指针指向不同实现接口的结构体实例达到多态。
结构体空结构体
空结构体大小为0,常用于chanel信号或者类型别名
// 空结构体
struct {}
// 空结构体实例
struct {}{}
struct定义
// 结构体
type 名称 struct {
// 属性
field ...
}
代码
//定义
type test struct{
name string
age int `json:"age"`
}
//声明
结构体
var t1 test
var t2 = test{}
结构体指针
t3 :=new(test)
//初始化
有名结构体
t4:=test{name:"test",age:1}
t5:=&test{"test2",1}
匿名结构体
t6:= struct {Name string}{Name:"test3"}
成员方法定义
// reciver type
// 值接收器 均可以使用
// 指针接收器 仅指针对象可以使用
func (reciver type) name([param...]) ([return ...]){
return [value...]
}
结构体嵌套(继承)
//定义
type test struct{
name string
age int `json:"age"`
}
func (t test) hello (){
}
//继承(匿名)
type test2 struct {
test
}
重写
func (t test2) hello (){
//被继承的方法
t.test.hello()
}
//继承(有名)
type test3 struct{
h test2
}
重写
func (t test3) hello (){
//被继承的方法
t.h.hello()
}
可见性
- 成员方法和成员变量小写包内可见,大写对外可见
- 指针变量成员方法对指针对象可见
- json序列化只序列化可见变量,收jsontag影响变量名
就近原则
-
继承匿名结构体与当前结构体具有相同名称的字段和方法名时,编译器优先采用当前结构体中的字段和方法。相当于重写被继承对象的字段和方法。
-
多个匿名结构体中存在相同名称的字段和方法时,就近原则失效,必须显示调用对应方法。
空接口
//所有结构体都实现Null接口
type Null interface {
}
//匿名空接口
interface {}
interface定义
type 接口名 interface{
func ...
}
代码
//定义接口
type human interface{
//接口方法
say () string
}
interface实现和继承
//继承接口
type student interface {
human
study()
}
//实现接口human
type man struct {
}
/重写方法
func (m man) say() string{
return "man"
}
//实现接口student
type studentA interface {
}
/重写方法
func (m student) say() string{
return "man"
}
/重写方法
func (m student) study() {
}
interface多态
类型断言
//value 对象值
//ok 断言判断 bool
//element interface变量
//T 断言类型
value,ok = element.(T)
//type 获取interface的类型
func typeJudge(x interface{}) {
switch x.(type){
case int,int8,int64,int16,int32,uint,uint8,uint16,uint32,uint64:
fmt.Println("整型变量")
case float32,float64:
fmt.Println("浮点型变量")
case []byte,[]rune,string:
fmt.Println("字符串变量")
default:
fmt.Println("不清楚...")
}
}
多态
//定义接口
type human interface{
//接口方法
say () string
}
//实现接口human
type man struct {
}
/重写方法
func (m man) say() string{
return "man"
}
//继承接口
type woman struct {
}
/重写方法
func (m woman) say() string{
return "woman"
}
var h human
h=man{}
h.say() // man
h=woman{}
h.say() //woman
结构体切片排序
调用 func Sort(data Interface) {} 底层使用快排,并使用Interface接口方法
Interface接口
type Interface interface {
// Len is the number of elements in the collection.
Len() int
// Less reports whether the element with index i must sort before the element with index j.
// See Float64Slice.Less for a correct implementation for floating-point values.
Less(i, j int) bool
// Swap swaps the elements with indexes i and j.
Swap(i, j int)
}
总结
- 接口实现和结构体继承
- 结构体继承是组合结构体中的全部属性和成员方法
- 接口实现时对结构体的成员方法扩展
- 接口是继承的补充扩展,继承注重代码复用,接口注重扩展解耦
- 接口和结构体注意事项
- 接口没有实例,只可以指向实现接口的结构体实例
- 结构体需要实现所有接口方法才算实现接口
- 接口默认是指针类型(引用类型),零值nil
- 空接口可以接收任何类型