面向对象特性

封装

隐藏对象的属性和实现细节,仅对外公开可控成员方法。主要通过结构体和方法访问可见性进行封装

继承

子类继承父类的所有特征和行为。主要通过结构体组合实现继承的效果

多态

同一类对象表现出不一样的具体实现。主要通过结构体实现接口,通过接口指针指向不同实现接口的结构体实例达到多态。

结构体

空结构体

空结构体大小为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()
}


可见性

  1. 成员方法和成员变量小写包内可见,大写对外可见
  2. 指针变量成员方法对指针对象可见
  3. json序列化只序列化可见变量,收jsontag影响变量名

就近原则

  1. 继承匿名结构体与当前结构体具有相同名称的字段和方法名时,编译器优先采用当前结构体中的字段和方法。相当于重写被继承对象的字段和方法。

  2. 多个匿名结构体中存在相同名称的字段和方法时,就近原则失效,必须显示调用对应方法。

接口

空接口

//所有结构体都实现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)
}
总结
  1. 接口实现和结构体继承
    1. 结构体继承是组合结构体中的全部属性和成员方法
    2. 接口实现时对结构体的成员方法扩展
    3. 接口是继承的补充扩展,继承注重代码复用,接口注重扩展解耦
  2. 接口和结构体注意事项
    1. 接口没有实例,只可以指向实现接口的结构体实例
    2. 结构体需要实现所有接口方法才算实现接口
    3. 接口默认是指针类型(引用类型),零值nil
    4. 空接口可以接收任何类型