01 结构体嵌套

  1. package main
  2. import (
  3. "fmt"
  4. "unsafe"
  5. )
  6. //结构体不允许嵌套结构体本身
  7. //可以嵌套结构体本身指针
  8. //链表的数据存储格式
  9. //线性存储 链式存储 树式存储 图式存储
  10. type student struct {
  11. *student
  12. name string
  13. age int
  14. sex string
  15. }
  16. func main(){
  17. //var stu student
  18. var a string="sdfhjsd"
  19. //计算数据类型在内存中占的字节大小
  20. fmt.Println(unsafe.Sizeof(a))
  21. fmt.Println(len(a))
  22. //stu.name="张三"
  23. //
  24. //fmt.Println(stu)
  25. }

02 面向对象计算器实现

package main

import "fmt"

//定义接口
type Opter interface {
    //方法声明
    Result() int
}

//父类
type Operate struct {
    num1 int
    num2 int
}

//加法子类
type Add struct {
    Operate
}

//减法子类
type Sub struct {
    Operate
}

//乘法子类
type Mlt struct {
    Operate
}

//工厂类
type Factory struct {
}

//加法子类的方法
func (a *Add) Result() int {
    return a.num1 + a.num2
}

//减法子类的方法
func (s *Sub) Result() int {
    return s.num1 - s.num2
}

//乘法子类的方法
func (m *Mlt) Result() int {
    return m.num1 * m.num2
}

//多态实现
func Result(o Opter) {
    value := o.Result()
    fmt.Println(value)
}
func (f *Factory) Result(num1 int, num2 int, ch string) {
    switch ch {
    case "+":
        var a Add
        a.num1 = num1
        a.num2 = num2
        Result(&a)
    case "-":
        var s Sub
        s.num1 = num1
        s.num2 = num2
        Result(&s)
    case "*":
        var m Mlt
        m.num1 = num1
        m.num2 = num2
        Result(&m)
    }
}

//通过设计模式调用
func main() {
    //创建工厂对象
    var f Factory
    f.Result(10, 20, "*")
}

//多态调用
func main0203() {
    //var a Add = Add{Operate{10, 20}}
    var s Sub = Sub{Operate{10, 20}}
    Result(&s)
}

//接口调用
func main0202() {
    var o Opter
    var a Add = Add{Operate{10, 20}}

    o = &a
    value := o.Result()
    fmt.Println(value)

}

//方法调用
func main0201() {
    //创建加法对象
    //var a Add
    //a.num1 = 10
    //a.num2 = 20
    //v := a.Result()
    //fmt.Println(v)

    //创建减法对象
    var s Sub
    s.num1 = 10
    s.num2 = 20
    v := s.Result()
    fmt.Println(v)
}

03 接口定义和使用

package main

import "fmt"

//先定义接口  在根据接口实现功能
type Humaner interface {
    //方法  方法声明
    SayHello()
    //Result(int, int) int
}

type Student struct {
    name  string
    age   int
    sex   string
    score int
}

type Teacher struct {
    name    string
    age     int
    sex     string
    subject string
}

func (s *Student) SayHello() {
    fmt.Printf("大家好,我是%s,我今年%d岁,我是%s生,我的成绩是%d分\n",
        s.name, s.age, s.sex, s.score)
}

func (t *Teacher) SayHello() {
    fmt.Printf("大家好,我是%s,我今年%d岁,我是%s生,我的学科是%s\n",
        t.name, t.age, t.sex, t.subject)
}

func main() {
    //接口是一种数据类型 可以接收满足对象的信息
    //接口是虚的  方法的实的
    //接口定义规则  方法实现规则
    //接口定义的规则 在方法中必须有对应的实现
    var h Humaner

    //对象创建
    stu := Student{"小明", 18, "男", 99}
    //stu.SayHello()
    //将对象信息赋值给接口类型变量
    h = &stu
    h.SayHello()

    tea := Teacher{"法师", 31, "男", "go语言与区块链"}
    //tea.SayHello()
    //将对象赋值给接口 必须满足接口中方法的声明格式
    h = &tea
    h.SayHello()
}

04 多态的实现

package main

import "fmt"

//先定义接口  在根据接口实现功能
type Humaner1 interface {
    //方法  方法声明
    SayHello()
    //Result(int, int) int
}

type Student1 struct {
    name  string
    age   int
    sex   string
    score int
}

type Teacher1 struct {
    name    string
    age     int
    sex     string
    subject string
}

func (s *Student1) SayHello() {
    fmt.Printf("大家好,我是%s,我今年%d岁,我是%s生,我的成绩是%d分\n",
        s.name, s.age, s.sex, s.score)
}

func (t *Teacher1) SayHello() {
    fmt.Printf("大家好,我是%s,我今年%d岁,我是%s生,我的学科是%s\n",
        t.name, t.age, t.sex, t.subject)
}

//多态的实现
//将接口作为函数参数  实现多态
func SayHi(h Humaner1){
    h.SayHello()
}

func main() {

    stu:=Student1{"小明",18,"男",99}
    //调用多态函数
    SayHi(&stu)

    //tea:=Teacher1{"法师",31,"男","go"}
    //SayHi(&tea)

}

05接口编程

package main

import "fmt"

//定义接口
type inter interface {
    //通信接口
    CSocketProtocol()
    //加密接口
    CEncDesProtocol()
}

//厂商1类
type CSckImp1 struct {
    data   string
    socket string
}

//厂商2类
type CSckImp2 struct {
    data   string
    socket string
    value int
}

func (cs1 *CSckImp1) CSocketProtocol() {
    fmt.Printf("厂商1的通信接口数据为:%s\n", cs1.socket)
}
func (cs1 *CSckImp1) CEncDesProtocol() {
    fmt.Printf("厂商1的加密接口数据为:%s\n", cs1.data)
}

func (cs2 *CSckImp2) CSocketProtocol() {
    fmt.Printf("厂商2的通信接口数据为:%s\n", cs2.socket)
}
func (cs2 *CSckImp2) CEncDesProtocol() {
    fmt.Printf("厂商2的加密接口数据为:%s 数值为:%d\n", cs2.data,cs2.value)
}

//多态实现
func framework(i inter) {
    i.CSocketProtocol()
    i.CEncDesProtocol()
}

func main() {
    cs1 := CSckImp1{"厂商1的加密数据", "厂商1的通信数据"}
    framework(&cs1)

    cs2 := CSckImp2{"厂商2的加密数据", "厂商2的通信数据",123}
    framework(&cs2)
}

06 接口的继承和转换

package main

import "fmt"

type Humaner interface {
    //子集
    sayhi()
}

type Personer interface {
    //超集
    //继承与humaner
    Humaner

    sing(string)
}

type Student struct {
    name string
    sex  string
    age  int
}

func (s *Student) sayhi() {
    fmt.Printf("大家好,我是%s,我是%s生,我的年龄是%d\n",
        s.name, s.sex, s.age)
}

func (s *Student) sing(name string) {
    fmt.Println("我为大家唱首歌", name)
}
func main0601() {

    //接口类型变量定义
    var h Humaner

    var stu Student = Student{"王飞", "男", 35}
    h = &stu
    h.sayhi()

    //接口类型变量定义
    var p Personer
    p = &stu

    //从humaner继承来的
    p.sayhi()
    p.sing("传奇")
}
func main0602() {

    //接口类型变量定义
    var h Humaner  //子集
    var p Personer //超集
    var stu Student = Student{"王飞", "男", 35}

    h = &stu
    //将一个接口赋值给另外一个接口
    //超集中包含所有子集的方法
    h = p //ok
    h.sayhi()

    //子集不包含超集
    //可以将超集赋值给子集  不能将子集赋值给超集
    //p = h //err

    //p.sayhi()
    //p.sing("红豆")

}

07 空接口定义和使用

package main

import "fmt"

func main0701() {

    var i interface{}

    //接口类型可以接收任意类型数据

    //fmt.Printf("%T\n", i)
    //i = 10
    //fmt.Printf("%T\n", i)
    //fmt.Println(i)
    //i = 3.14
    //fmt.Printf("%T\n", i)
    //fmt.Println(i)
    //i = "传智播客"
    //fmt.Printf("%T\n", i)
    //fmt.Println(i)

    i = 10

    //接口类型 不能直接进行转换需要使用类型断言
    //var a int =20
    //var a interface{}
    //a = 20

    fmt.Println(i)
}

func test() {
    fmt.Println("test hello world")
}
func main0702() {
    //空接口类型的切片
    var i []interface{}

    //fmt.Printf("%T\n",i)
    i = append(i, 10, 3.14, "传智播客", test)

    for idx := 0; idx < len(i); idx++ {
        fmt.Println(i[idx])
    }
}

08 类型断言

package main

import "fmt"

func main0801() {
    var i interface{}
    i = 10.234
    //value,ok:=map[key]
    //值,值的判断:=接口变量.(数据类型)
    value, ok := i.(int)
    if ok {
        fmt.Println("整型数据:", value+10)
    } else {
        fmt.Println("错误")
    }

}
func demo() {
    fmt.Println("demo hello world")
}
func main() {
    var i []interface{}

    i = append(i, 10, 3.14, "传智播客", demo,123,test)

    for _, v := range i {
        //fmt.Println(idx,v)

        if data, ok := v.(int); ok {
            fmt.Println("整型数据:", data)
        } else if data, ok := v.(float64); ok {
            fmt.Println("浮点型数据:", data)
        } else if data, ok := v.(string); ok {
            fmt.Println("字符串数据:", data)
        } else if data, ok := v.(func()); ok {
            //函数调用
            data()
        }
    }

}